2016-11-17 11 views
-2

私はそれが非常に魅力的なプログラミングスタイルは、例えば、構造体に直接インライン構造体/クラスのすべてのメソッドを定義するだけで構造体をこのように定義見つける:クラスメソッドのインライン定義

"A.hpp" 
class A; 

"A.cpp" 
class A 
{ 
    A() = default; 
    void method() { } 
}; 

ではなく

"A.hpp" 
class A 
{ 
    A(); 
    void method(); 
}; 

"A.cpp" 
A::A() = default; 
void A::method() { } 

これは、コードファイルにクラス/構造体定義を置き、ヘッダファイルに宣言だけを含めることを意味します。

しかし、これは、コンパイラは、他のコードファイル内の構造体/クラスのレイアウトを知っておく必要があるだろう問題に実行されます。

これをサポートしているプログラミングスタイルはありますか?おそらくgetters/setterを介してフィールドを取得して設定するだけですか?しかし、この方法は大量のボイラープレートにつながります。 1が明示的に他に宣言を置きますしない限り、単にヘッダファイル内の構造体/クラス定義を含む

は、相互再帰的なヘッダファイルの問題につながります。

私は、モジュールシステムとDのような言語では、このプログラミングスタイルを実現することができますが、どのように1は、C++でそれを達成していますか?

+0

のように、ヘッダファイルにインラインメソッドを定義し、コンパイラはそれは(そのサイズを決定するために)含まれているものを、変数を知っている必要があり、どのようなメンバー関数は(それはのためのシンボルを生成することができましたリンク)。したがって、クラス定義は、実際にそのクラスを使用するファイル(つまり、ポインタや参照を宣言する以外のもの)では常に表示されなければなりません。あなたのアイディアはコンパイルを遅らせたり、クラスの定義を乱雑に見せたりする有効なオプションですが、クラスの定義をソースファイルに入れると間違ったことになります。 –

+0

C++コンパイルモデルは、あなたがしようとしていることを不可能にします。 – SergeyA

+0

私はOPの望むことをすることが不可能であるため、この質問を議論の対象外としています。 – SergeyA

答えて

0

あなたは何をしていますかは、前方宣言と呼ばれます。

あなたはそれを定義する1つの.cppファイルを除き、他のすべての翻訳単位で、このクラスでは何も(f.e.コール・メソッド、インスタンスを作成する)行うことができないだろう。だから、このアイデアはまったく役に立たず悪いです。そして、あなたはリンカーエラーのボートロードを取得します。

だから、あなたはスタイル#2に固執するのいずれかが必要です。またはクラスを使用するには、この

struct A { 
    A() {} // something 
    int func() { /* function body */ 
} 
+0

私はあなたがその質問を間違って解釈したと思います。私は技術的な理由を理解していますなぜ私はこれを行うことができません、どうして私はこれを回避することができます質問です。 – sprw121

+0

@ sprw121あなたが望むようにそれを行う方法はありません。 おそらく、別のヘッダーを作成し、クラス定義全体を入れて元のヘッダーに含めることができます。しかし、これはまだ醜いです – Starl1ght

関連する問題