定義というより宣言の話ですが。
他の翻訳単位に定義がある場合のclassやstructの宣言はどうすればよいですか。
分割コンパイルにおける型定義
Re:分割コンパイルにおける型定義
質問の意図を確認させてください。
クラスの宣言というのは、
それに対して、クラスの定義は、
宣言であれば、前述以外の書き方はできないのですが、そういうことでよろしいでしょうか?
クラスの宣言というのは、
class A;です。
それに対して、クラスの定義は、
class A { public: void func(); };です。
宣言であれば、前述以外の書き方はできないのですが、そういうことでよろしいでしょうか?
Re:分割コンパイルにおける型定義
お返事遅くなり申し訳ございません。
質問の内容ですが、もう少し具体的に言うと、
例えばa.cppというファイルでクラスを定義して
b.cppというファイルでそのクラスを使う場合に、
b.cppでクラスを宣言していてもエラーがでますよね。
例えばbccでは以下のエラーが。
・未定義の構造体
・サイズが不明、あるいはゼロ
この対処はどうすれば良いのか、ということです。
関数や変数ならexternキーワードが使えますが、
クラスの宣言には使えないようですし。
質問の内容ですが、もう少し具体的に言うと、
例えばa.cppというファイルでクラスを定義して
b.cppというファイルでそのクラスを使う場合に、
b.cppでクラスを宣言していてもエラーがでますよね。
例えばbccでは以下のエラーが。
・未定義の構造体
・サイズが不明、あるいはゼロ
この対処はどうすれば良いのか、ということです。
関数や変数ならexternキーワードが使えますが、
クラスの宣言には使えないようですし。
Re:分割コンパイルにおける型定義
1. classをヘッダで定義し、両方のcppから#includeする。
2. b.cppでa.cppを#includeする。
そして必要なら、a.cpp自体はコンパイルしない、
#ifdefマクロで切り替えるなど、の対策を追加。
3.そのクラスはポインタ(ハンドル)としてしか使わない。
> でそのクラスを使う場合に、
# C/C++のFILE*みたいな使い方。
classの宣言についてはたかきさんの書かれている通りで、
本当に"宣言"しかなくて、classの定義が必要な使い方をする限り、
そうするしかない。
2. b.cppでa.cppを#includeする。
そして必要なら、a.cpp自体はコンパイルしない、
#ifdefマクロで切り替えるなど、の対策を追加。
3.そのクラスはポインタ(ハンドル)としてしか使わない。
> でそのクラスを使う場合に、
# C/C++のFILE*みたいな使い方。
classの宣言についてはたかきさんの書かれている通りで、
本当に"宣言"しかなくて、classの定義が必要な使い方をする限り、
そうするしかない。
Re:分割コンパイルにおける型定義
回答ありがとうございます。
先程の投稿の後、自分でももう一度調べてみました。
まぁBanさんの挙げた中では1の方法しか見つかりませんでしたが。
翻訳単位毎に定義できるので、翻訳単位が増えれば定義可能回数も増えると。
定義が複数あるというのは、なんとなく気持ち悪いですけどね。
先程の投稿の後、自分でももう一度調べてみました。
まぁBanさんの挙げた中では1の方法しか見つかりませんでしたが。
翻訳単位毎に定義できるので、翻訳単位が増えれば定義可能回数も増えると。
定義が複数あるというのは、なんとなく気持ち悪いですけどね。