22

これは、次のような他のいくつかの質問に関連しています: this、および私の他のいくつかの質問。

この質問や他の質問では、文字列配列を宣言して初期化できることがわかります。たとえば、次のようになります。

const char* const list[] = {"zip", "zam", "bam"}; //from other question

これは、問題なく関数の実装で、またはスコープ外の .cpp ファイルの本体で実行できます。

私がやりたいことは、私が使用しているクラスのメンバーとして、次のような配列を持つことです:

class DataProvider : public SomethingElse
{
    const char* const mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"};

public:
    DataProvider();
    ~DataProvider();

    char* GetData()
    {
        int index = GetCurrentIndex(); //work out the index based on some other data
        return mStringData[index]; //error checking and what have you omitted
    }

};

しかし、コンパイラが不平を言い、その理由がわかりません。クラス定義のワンステップで、このような配列を宣言して初期化することは可能ですか? より良い代替手段はありますか?

4

3 に答える 3

18

キーワード static および external initialization を使用して、配列をクラスの静的メンバーにします。

ヘッダー ファイル内:

class DataProvider : public SomethingElse
{
    static const char* const mStringData[];

public:
    DataProvider();
    ~DataProvider();

    const char* const GetData()
    {
        int index = GetCurrentIndex(); //work out the index based on some other data
        return mStringData[index]; //error checking and what have you omitted
    }

};

.cpp ファイル内:

const char* const DataProvider::mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"};
于 2008-11-12T18:29:41.510 に答える
3

これは C++ では不可能です。配列を直接初期化することはできません。代わりに、サイズ (この場合は 4) を指定する必要があり、DataProvider のコンストラクターで配列を初期化する必要があります。

class DataProvider {
    enum { SIZEOF_VALUES = 4 };
    const char * values[SIZEOF_VALUES];

    public:
    DataProvider() {
        const char * const v[SIZEOF_VALUES] = { 
            "one", "two", "three", "four" 
        };
        std::copy(v, v + SIZEOF_VALUES, values);
    }
};

配列を直接初期化することはできないため、配列内のポインターの定数性をあきらめる必要があることに注意してください。ただし、後でポインターを正しい値に設定する必要があるため、ポインターは変更可能である必要があります。

それにもかかわらず、配列内の値が const である場合、唯一の方法は静的配列を使用することです。

/* in the header file */
class DataProvider {
    enum { SIZEOF_VALUES = 4 };
    static const char * const values[SIZEOF_VALUES];
};

/* in cpp file: */

const char * const DataProvider::values[SIZEOF_VALUES] = 
    { "one", "two", "three", "four" };

静的配列を持つということは、すべてのオブジェクトがその配列を共有することを意味します。したがって、メモリも節約できます。

于 2008-11-12T18:25:48.290 に答える
3

そのように配列を宣言できない理由 (const char* []) は次のとおりです。

  • クラス宣言に初期化子を含めることはできません。
  • 構文const char* []は、コンパイラが各インスタンスに割り当てる必要があるスペースの量を示していません (配列はインスタンス変数として宣言されています)。

さらに、その配列は本質的に定数値であるため、おそらくその配列を静的にしたいと思うでしょう。

于 2008-11-12T18:25:57.943 に答える