0

クラスの前方宣言を使用して、クラスの定義と実装を使用後にプログラムの後半に配置できますか(関数で行われるのと同様)?

(プログラムの複数のソースファイルをファイルに結合する必要がありmainます。ファイルの先頭に配置するには、クラスの定義と実装をファイルの最後に配置します。)

4

2 に答える 2

2

はい、ある程度はできます。

C ++コンパイラは非常に愚かであり、先読みしないことを理解する必要があります。これが、関数プロトタイプを使用しなければならない理由です(他のいくつかの理由の中でも)。さて、関数はコンパイラーが解決するのは難しくありません。関数の戻り型と関数のパラメーターの型を確認し、関数が実際に何であるかを知らなくても、関数がそこにあると想定します。これは、最終的にはその時点では問題にならないためです。 。

ただし、クラスの内容は重要です(たとえば、コンパイラはクラスのサイズを知る必要があります)。しかし、先読みしないことを覚えていますか?クラスを前方定義すると、コンパイラーはそのクラスに何が含まれているかを認識しないため、クラスに関する多くの情報が欠落しています。たとえば、どのくらいのスペースを予約する必要がありますか?

したがって、クラスを転送定義することはできますが、それらを値型として使用することはできません。(具体的に宣言される前に)それを使ってできる唯一のことは、それへのポインターを使用することです(そして、@ Cheersandhth.-Alfによるポインターとして、関数の戻り型とテンプレート引数として使用します)。

使用する必要があるものがポインターでない場合は、おそらくヘッダーを使用する必要があります(これについて詳しく知りたい場合は、これを読んでください)。

于 2013-01-15T19:19:07.367 に答える
1

以前のどこかにクラス定義がないと、クラスメンバーを使用したり、インスタンスを作成したりすることはできませんが、

  • T *およびT&タイプを使用し、

  • 正式な戻り型とパラメーターの宣言にはTを使用します(値でもそうです)。

  • テンプレートパラメータとしてTを使用し、

そしておそらくそれ以上ですが、上記は私にすぐに起こったことです。

したがって、それが必要なすべてである場合は、前方宣言を実行する準備ができています。

ただし、スケッチされた状況で前向きな宣言があなたを購入するのは、2つの場所で同じコードを維持する追加の作業であるため、その要点を理解するのは困難です…


ああ、私はちょうど思い出しました、前方宣言された不完全な型に関連する特に厄介な未定義動作があります。つまり、delete pwherepが不完全な型へのポインタを使用することです。これには、デストラクタが簡単である必要があります。コンパイラが優れている場合は警告しますが、期待しないでください。


要約すると、すべての問題を回避して、コードが属するコードの最後mainに配置します。

于 2013-01-15T19:26:23.507 に答える