C ++でグローバルな動的に割り当てられた構造体
-
27-10-2019 - |
質問
初期サイズのない構造体の配列を使用しようとするのに問題があります。どうすればいいですか?これが私の構造です:
struct carbon {
double temp;
double mass;
rowvec::fixed<3> position;
rowvec::fixed<3> velocity;
rowvec::fixed<3> force;
} *atom;
私のプログラム中に、私はこのようなstructアレイのサイズを割り当てます:
atom = new carbon[PARTICLE_NUM];
問題は、この構造を他のファイルで使用する方法です。ヘッダーファイルを作成して、これに入れました
extern struct carbon *atom;
しかし、このエラーが発生します。
setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’
グローバル変数を使用すべきではないことは知っていますが、最初にこれをテストしたいだけです。助けてくれてありがとう。
解決
使用するソースファイル atom
の完全な定義が必要です carbon
構造。
このように、同じヘッダーファイルに構造を外部とまとめます。
struct carbon {
double temp;
double mass;
rowvec::fixed<3> position;
rowvec::fixed<3> velocity;
rowvec::fixed<3> force;
};
extern struct carbon *atom;
変数を定義します atom
ソースファイルの1つで:
struct carbon *atom = 0;
今、あなたがアクセスする必要があるときはいつでも atom
, 、構造と外部宣言があるヘッダーファイルを含め、機能するはずです。
詩持っている代わりに atom
グローバルネームスペースの変数では、独自の名前空間に配置できます。
namespace some_clever_name
{
struct carbon { ... };
extern carbon *atom;
}
これをソースファイルに入れます。
some_clever_name::carbon *some_clever_name::atom = 0;
他のヒント
構造体の定義は、ヘッダーファイルにある必要があります。
構造の定義を含める必要があります carbon
ヘッダーファイルに、そのヘッダーファイルをファイルに含める(.h
また .cpp
)これらの不完全なタイプエラーを取得している場所。
なぜエラー?
フォワード宣言を使用するときはいつでも、そのタイプはコンパイラの不完全なタイプになります。これは、コンパイラがフォワード宣言されたエンティティがデータ型であるが、レイアウトやその内部について何も知らないことを知っているためです。コンパイラが必要な操作タイプレイアウトは、エラーに不満を言う必要があります。
あなたの場合、コンパイラは構造のサイズを知る必要があります carbon
十分なメモリを割り当てるためには、それは順方向に宣言されたタイプであるため、エラーに不満を言うため、それはできません。
他の回答が言うように、ヘッダーファイルに構造体の定義を含める必要があります。しかし、自問しましょう どうして あなたはこれを必要とします?
C ++は最初からCに基づいており、C A Simpleコンパイル戦略から継承します。コンパイラは1つのパスを作成し、コンパイラもリンカーも提示されたファイル以外のものにアクセスする必要はありません。 CとUNIXが最初に開発されたとき、住所スペースは限られており、プロセッサはほとんどの人が想像できるよりも遅くなりました。私のKindle Fireは、90年代まで使用していたものよりもかなり大きなコンピューターです。
コンパイラをシンプルにしていたため、PL/I(Cの祖先の1つ)のようなより複雑なスキームを使用する代わりに、プリプロセッサを構築し、使用したファイルを使用しました。コンパイラは、構造の「形状」を知る必要があるため、コードを生成できるようにする必要があります。たとえば、アクセスしたい場合に mass
, 、構造体の先頭からのオフセットを知る必要があります。したがって、CおよびC ++では、テキストでは、その「形」の説明を含める必要があります。