web-dev-qa-db-ja.com

文字列の静的配列を初期化していますか(C ++)?

私はこれを適切に行う方法を一生理解することができません。いくつかの定数(列挙型の値に対応するテキスト)を格納する必要があるクラスがあります-クラスで次のように(公に)宣言しています:

const static char* enumText[];

そして、私はそれを次のように初期化しようとしています:

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

ただし、gccでは次のエラーが発生します。

'const char * MyClass :: enumText []'は 'classMyClass'の静的メンバーではありません

私は何が間違っているのですか?ありがとう!

14
Paul D.

このコードはコンパイルされます:

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

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

コードを確認して、違いを見つけてください。クラスで静的属性を定義しなかったか、ヘッダーを含めるのを忘れたか、名前を間違って入力したとしか思えません。

これはgccバージョン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;
}

コンパイル済み:

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

よろしいですかMyClass::enumTextは適切なクラスを参照していますか?

6
E.M.

コンパイラが言うように、あなたはMyClassの静的メンバーを定義しようとしています。これはconst char*enumTextという名前の配列。クラスに宣言がない場合は、問題があります。

あなたが持っている必要があります:

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

または、静的メンバーが必要ない場合もあります。そうでない場合は、名前にクラスを使用する必要はありません。

とにかく、それは配列の初期化とは何の関係もありません。

2
Klaim

エラーメッセージを考えると、enumText []が宣言されていないMyClassの宣言がどこかにあるようです(別のヘッダーにあるのではないでしょうか?)。エラーメッセージは、コンパイラがMyClassについては知っているが、enumTextメンバーについては知らないことを示しています。

影に潜んでいるMyClassの宣言が複数あるかどうかを確認したいと思います。

wintermute's または T.E.D.'s の例をコンパイルできますか?

2
Michael Burr

次のコードは、VS2005で問題なくコンパイルされます。

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

私が大げさな推測をしなければならなかったとしたら、あなたの初期化行は別のソースファイルにあり、MyClassを含む.hファイルを#includeするのを忘れたと思います。それはまさに私がいつも台無しにしてやっていることのようなものです。

また、constが間違った場所にある(または十分でない)可能性が非常に高いようです。現在のように、定数であるのは配列でも、配列内のポインターでもありません。その中の文字要素だけです。

1
T.E.D.