Pytanie Inicjowanie statycznej tablicy łańcuchów (C ++)?


Nie mogę dla mojego życia dowiedzieć się, jak to zrobić właściwie. Mam klasę, która musi przechowywać pewne stałe (tekst, który odpowiada wartościom w typie wyliczenia) - mam to zadeklarowane w ten sposób (publicznie) w mojej klasie:

const static char* enumText[];

I próbuję zainicjować to tak:

const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" };

Jednak gcc daje mi następujący błąd:

'const char * MyClass :: enumText []' nie jest statycznym członkiem klasy 'Class MyClass'

Co ja robię źle? Dzięki!


13
2017-09-03 22:16


pochodzenie


Spróbuj: static const char * enumText []; w klasie? - Walt W
Podejrzewam, że jest to starsza wersja g ++, która niepoprawnie traktuje const static char* [] tam jak static char* [] const zamiast static const char* [] (z powodu static będąc w "niezwykłym" miejscu). - Pavel Minaev
Czy możesz wkleić kompletny i kompilowalny fragment kodu do swojej odpowiedzi, który pokazuje problem? - sbi


Odpowiedzi:


Ten kod kompiluje:

struct X {
   static const char* enumtext[];
};

const char* X::enumtext[] = { "A", "B", "C" };

Sprawdź swój kod i znajdź różnice. Mogę tylko myśleć, że nie zdefiniowałeś statycznego atrybutu w klasie, zapomniałeś włączyć nagłówka lub źle wpisałeś nazwę.


14
2017-09-03 22:26



Linia 5 powinna mieć X::enumtext albo dopiero tworzysz nową zmienną. - E.M.
To była literówka w odpowiedzi, poprawiłem ją. W każdym razie kod kompiluje się z gcc (zarówno 4.0 w MacOSX i 4.3 w Ubuntu) - David Rodríguez - dribeas
Wooo Czuję się głupio, miałem literówkę, której nie zauważyłem .. - Paul D.
Jest nas dwóch. - David Rodríguez - dribeas
Jak zrobiłbyś to, gdyby typ danych był std::stringzamiast char*? - gone


Kompiluje się z gcc w wersji 4.0.1:

#include <iostream>

class MyClass {
public:
    const static char* enumText[];
};

const char* MyClass::enumText[] = { "a", "b", "c" };

int main()
{
    std::cout << MyClass::enumText[0] << std::endl;
}

Skompilowany z:

g++ -Wall -Wextra -pedantic s.cc -o s

Jesteś tego pewien Moja klasa::enumText odwołuje się do właściwej klasy?


6
2017-09-03 22:43





Jak mówi kompilator, próbujesz zdefiniować statyczny element memorialowy MyClass, który byłby tablicą const char * o nazwie enumText. Jeśli nie masz deklaracji na zajęciach, pojawia się problem.

Powinieneś mieć :

class MyClass
{
   //blah
   static const char* enumText[];
};

a może nie chcesz statycznego członka. Jeśli nie, nie powinieneś używać klasy w nazwie.

W każdym razie, że nie mają nic wspólnego z intializacją tablicy.


2
2017-09-03 22:21



Op mówi "Mam to zadeklarowane w ten sposób (publicznie) w mojej klasie" - snarf
@Snarfblam: ale często to, co mówi OP, a rzeczywistość to dwie różne rzeczy - zwłaszcza, że ​​to, co mówi, że zrobił, powinno działać. - Michael Burr


Biorąc pod uwagę komunikat o błędzie, wydaje mi się, że masz deklarację MyClass gdzieś (w innym nagłówku może?), który nie zawiera deklaracji enumText []. Komunikat o błędzie wskazuje, że kompilator wie o tym MyClass, ale nie wie o tym enumText członek.

Chciałbym sprawdzić, czy masz wiele deklaracji MyClass czai się w cieniu.

Czy możesz dostać wintermute's lub T.E.D.'s przykłady do kompilacji?


2
2017-09-03 22:59





Poniższy kod kompiluje się dobrze dla mnie w VS 2005:

class MyClass
{
const static char* MyClass::enumText[];
};
const char* MyClass::enumText[] = { "A", "B", "C", "D", "E" };

Gdybym musiał się domyślić, powiedziałbym, że twoja linia initilization jest w osobnym pliku źródłowym, a ty zapomniałeś # dołączyć plik .h, który zawiera MyClass. To jest dokładnie to, co robię przez cały czas.

Ponadto, wydaje mi się całkiem prawdopodobne, że masz const w niewłaściwym miejscu (lub niewystarczająco). Tak jak teraz, nie jest to tablica, która jest stała, ani wskaźniki w tablicy; tylko elementy charakteru w nim zawarte.


1
2017-09-03 22:40