0

配列を使用してネストされた構造体を作成するのを手伝ってください。このコードを修正するにはどうすればよいですか?

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

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

ありがとう。

4

4 に答える 4

2

として宣言BufferSizeした場合でもconst、クラススコープでは、C ++で配列サイズを宣言するために必要なコンパイル時定数は宣言されませんが、コンストラクターで設定されると、存続期間中は変更できない定数データメンバーが宣言されます。インスタンスの(ただし、インスタンスごとに異なる場合があります)。

2つの解決策:

  1. BufferSize static constクラススコープで、または
  2. (ちょうど)const名前空間スコープ(グローバルスコープを含む)で。
于 2009-07-28T13:42:03.147 に答える
1

静的配列は、コンパイル時に長さを知る必要があります。そうでない場合は、メモリを動的に割り当てる必要があります。

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 :: vectorを使用したほうがよいでしょう:

struct CCheckSum
{
    CCheckSum() : Buffer(500, 0) {}
    std::vector<char> Buffer;  // A std::vector keeps
                               // track of its size enternally
}SmallBuffer;
于 2009-07-28T13:28:02.507 に答える
0

ネスティングに関しては問題ありません。

配列のサイズは一定です。BufferSizeを定数にするか、char[]の代わりにstd::vectorを使用してください。

于 2009-07-28T13:28:39.683 に答える
0

実行時に配列サイズを変更することはできません。コンパイル時にそれ自体を知る必要があります。このユースケースでは、std::vectorを使用できます。また、CCheckSumという名前のコンストラクターを作成する前に、構造体名を指定する必要があります。

struct CCheckSum
        {
            CCheckSum() : ....
于 2009-07-28T13:32:09.663 に答える