2010-09-16 13 views
9

Czy można w ogóle zadeklarować ciąg znaków w pliku nagłówkowym (.h), w definicji klasy?Czy mogę zadeklarować ciąg w pliku nagłówkowym w definicji klasy?

Gdy chcę ustawić domyślną int, robię:

class MyClass 
{ 
    static const unsigned int kDATA_IMAGE_WIDTH = 1024; 

Czy istnieje sposób, aby zrobić to samo dla obiektu string?

class MyClass 
{ 
     static const string kDEFAULT_FILE_EXTENSION = "png"; // fail 

wiem, że mogę używać #define ...

#define kDEFAULT_FILE_EXTENSION "png" 

dzięki

edit: dodaje, że w definicji klasy. zaktualizowane przykłady.

+0

Co kompilatora używasz i jaki jest błąd? To działa dla mnie. – vanza

+0

Błąd Xcode (gcc to jest?) To: 'błąd: niepoprawna inicjalizacja klasy w statycznym elemencie danych typu niecałkowego 'const std :: string'' – Ross

+0

Czy jesteś pewien, że jesteś w odpowiednim obszarze nazw. Spróbuj std :: string. Czy robisz to w klasie? –

Odpowiedz

11

Z komunikatu o błędzie dałeś (kopalnia nacisk):

error: invalid in-class initialization of static data member of non-integral type 'const std::string'

Można to zrobić w pliku nagłówka, ale nie można zrobić w klasie.

Czyli:

class MyClass 
{ 
    static const std::string invalid = "something"; 
}; 

nie jest ważny, ale

static const std::string valid = "something else"; 

jest prawidłowy.

Jeśli chcesz statyczne być członkiem klasy tylko, to zrobić:

//Header 
class MyClass 
{ 
    static const std::string valid; 
}; 


//Implementation (.cpp) file 

const std::string MyClass::valid = "something else again"; 

Tylko const statyczna integralne zmienne klasy mogą być inicjowane za pomocą „= stałą” składnię.

+0

Niestety, jest w definicja klasy. Zaktualizowałem moje pytanie. Dzięki – Ross

+0

@Ross: Cóż, moja odpowiedź się nie zmienia. ;) Ostatnie pole kodu powie ci, jak to zrobić poprawnie. –

+0

Musiałem usunąć słowo kluczowe 'static' z pliku implementacji (.cpp). –

1

tak, ale ciągi nie są nieodłączne dla C++. potrzebujesz notatki #include

#include <string> 

static const std::string kDEFAULT_FILE_EXTENSION = "png"; 

Na notatkę boczną. Nigdy nie widziałem, aby kod C++ używał przedrostka k do oznaczenia stałej. Myślę, że to konwencja Objective-C. Również symbole ALL_CAPS powinny być naprawdę zarezerwowane dla makr #define, a nie stałych językowych.

+0

hmmm, dziękuję, ale mnie nie działasz? ...: 'error: niepoprawna inicjalizacja klasy statycznego elementu danych typu nie zintegrowanego 'const std :: string'' – Ross

+1

Nie wiedziałam, że próbujesz to zrobić wewnątrz klasy. – Ferruccio

+0

Apologie ... moje niedoświadczenie, powinienem był o tym wspomnieć. – Ross

0

Tak, powinieneś być w stanie zadeklarować ciągi znaków lub umieścić dowolny inny kod w pliku nagłówkowym. Może się to nie udać, ponieważ w pliku nagłówkowym brakuje #include, która definiuje ciąg znaków lub musisz umieścić przed nim "std ::", jeśli nie używasz "namespace std" w pliku nagłówkowym.

Zaktualizuj pytanie, podając konkretny błąd kompilatora, jeśli te sugestie go nie naprawią. Mam nadzieję, że to pomaga.

0

nie mam kontekst tutaj, ale jeśli intencją jest, aby zdefiniować niezmienny tablicę znaków zakończone znakiem „\ 0”, to dlaczego nie wykorzystać:

static const char kDEFAULT_FILE_EXTENSION [] = „png ";

Należy również pamiętać, że nie ma przejrzysty konwersja między klasy string i char const * bez wywoływania ciąg :: c_str() ..

0

dwie możliwości:

zdefiniować funkcję w nagłówku, który jest statyczny i zwraca żądany ciąg znaków.

static std::string kDEFAULT_FILE_EXTENSION() 
    { 
     return "png"; 
    } 

Makro zrobi dobry uczynek tutaj

#define STATIC_STRING_IN_HEADER(name,value) static std::string name(){return value;} 
STATIC_STRING_IN_HEADER(kDEFAULT_FILE_EXTENSION,"png") 
Powiązane problemy