質問

ください、私を入れ子構造と配列になります。どうすればいいコードについて教えてください。

class CMain
{
    public:
        CMain();
        ~CMain();

    private:
        struct
        {
            CCheckSum() : BufferSize(500) {memset(Buffer, 0, BufferSize);}
            const int BufferSize;
            char Buffer[BufferSize];
        }SmallBuffer;
}

感謝。

役に立ちましたか?

解決

静的配列はコンパイル時にその長さを知っている必要があります。または、メモリを動的に割り当てる必要があります:

struct CCheckSum
{
    CCheckSum()
    : BufferSize(500),
      Buffer(new char[BufferSize])
    {
        memset(Buffer, 0, BufferSize);
    }
    ~CCheckSum() { delete[] Buffer; } // Note the use of delete[]!
    const int BufferSize;
    char* Buffer;
}SmallBuffer;

あなたはしかし、のstd ::ベクトルを使用してオフにおそらく方がよいでしょう。

struct CCheckSum
{
    CCheckSum() : Buffer(500, 0) {}
    std::vector<char> Buffer;  // A std::vector keeps
                               // track of its size enternally
}SmallBuffer;

他のヒント

ていても、宣言された BufferSize として const, は、クラスの適用範囲こないを申告することがコンパイル時間を一定に必要な宣言する配列のサイズC++でも一定のデータの委員は、一度設定のコンストラクタの変更はできませんなの寿命のインスタンスができるものごとに異なることします。

二つのソリューション作

  1. BufferSize static const クラスの範囲、または
  2. (だけ) const で名前空間範囲を含むグローバル範囲).

の入れ子に関連した問題はありません。

アレイは、一定の大きさを持っています。いずれかたBufferSize定数を作るまたはchar []の代わりのstd ::ベクトルを使用します。

配列のサイズは、実行時に変更することはできません。これは、コンパイル時、それ自体で知られている必要があります。 あなたは、このユースケースのためのstd ::ベクトルを使用することができます。 また、構造体名は、名前CCheckSumでコンストラクタを書き込む前に与えられるべきである。

struct CCheckSum
        {
            CCheckSum() : ....
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top