4

コンパイル済みの .o ファイルを受け取ったプログラムがありますが、元の .cc ファイルはなく、途中で完成したヘッダー ファイルしかありません。ヘッダー ファイルにはすべてのメソッド シグネチャがありますが、プライベート変数の宣言がありません。この .o ファイルをプロジェクトで動作させようとしていますが、.o ファイルで定義されたクラスのコンストラクターでセグメンテーション違反が発生します。プログラムがコンパイルされます。これを機能させるにはどうすればよいですか?このプログラムは宿題であり、教師は私たちに .cc ファイルを見せることを望んでいません。また、私の先生はその問題について知っています。私は自分でそれを理解しようとしています(そしてうまくいけば皆さんの助けを借りて:))。少し前に別の先生と一緒にやったと思っていましたが、問題はありませんでした。プログラムのコンパイルに使用されるメイクファイルがあります。

4

1 に答える 1

4

C++ プログラムを使用していて、ヘッダー ファイルにクラス定義が含まれている場合、そのクラス定義は、最初にファイルをビルドするために使用されたものと正確に一致する必要があります。これが1 つの定義ルールです。教授がクラス定義からプライベート変数宣言を削除した場合、クラッシュする可能性があります。これは、さまざまな .o ファイルが、それらのクラスによって定義されたオブジェクトのサイズについて一致しないためです。

教授がクラスの実装を隠したい場合は、p/impl パターンを使用する必要があります。ヘッダー ファイルを使用する場合は、マングルされたクラス定義を完全に削除し、それらを使用しないようにする必要がありclass Foo;ます (ただし、クラスをポインター パラメーターとして受け取る/返す関数を満たすために前方定義を使用できます)。

于 2011-10-30T01:37:00.570 に答える