0

ヘッダーファイルに構造体があります

 struct Foo{
     timeval t;
     struct Bar b;
 }

また、同じヘッダーファイルにBar用の別のクラスがあり、ヘッダーファイルにもクラスを宣言しました。

 class Layer{
      public:
              ...
              ...
      private:
              struct Foo myarray[];
 }

ヘッダーファイルでFooの配列を宣言し、クラスコンストラクターで初期化したい

 Layer::Layer(unsigned int size)
 {
       myarray = new Foo[size];
 }

ただし、コンパイル時にエラーが返されます。エラー:「Foo*」から「Foo[0]」への割り当てに互換性のない型</p>

これを修正する方法はありますか?

4

3 に答える 3

2

それは配列の初期化ではなく、割り当てです。初期化するには、メンバー初期化子が必要です。

Layer::Layer(unsigned int size) : myarray(new Foo[size]){}

ただし、コンパイル時に既知の 1 つのサイズで初期化する必要がある配列があるため (次元が指定されていない場合は初期化子リストを介して)、そのサイズは変更できないため、コンパイルされません。代わりにベクトルを使用します。

std::vector<Foo> myarray;

Layer::Layer(unsigned int size) : myarray(size){}

ベクトルがオプションでない場合は、少なくともnewそれへのポインターが必要ですが、3/5 のルールが適用され始め、すべてが混乱します。可能であれば、ベクトルに固執してください。

于 2012-10-15T05:55:25.907 に答える
1

struct Foo myarray[];struct Foo *myarray;動的なアプローチでそれを使用する場合は、そうする必要があります。それ以外の場合、それを不特定の静的にしたい場合は、初期化リストが必要だと思います。

于 2012-10-15T05:53:23.807 に答える
0

myArray の宣言を次のように変更します。

struct Foo * myArray;

インデックス演算子 ( myarray[index] など) を使用して、通常どおり配列にアクセスできます。範囲外にアクセスしないようにする必要があります。つまり、 index は 0 未満またはsizeより大きくしてはなりません。

myarray = new Foo[size];
myarray[0];  // Fine
myarray[-1];  // Crash!

myarray[size - 1];  // Also fine
myarray[size];  //  Another crash!

また、削除するときは、通常の削除演算子の代わりに delete[] 演算子を使用する必要があります。

delete[] Foo;

コードが失敗する理由は、コンパイラがコンパイル時に配列のサイズを知る必要があり、実行時にサイズを割り当てようとしているためです。これをポインタに変更すると、メモリ アドレスを指すようにコンパイラに指示されます。以下を使用して配列を作成する場合:

myarray = new Foo[size];

新しい配列がメモリに割り当てられ、myarrayがその配列のアドレスを指すようになります。

于 2012-10-16T09:30:06.210 に答える