2009-12-07 18 views
7

私は学校のプロジェクトに取り組んでいます。インストラクターは、すべてのコードが1つの.cppファイルに保存されていると主張しています。このファイル内に複数のクラスを定義したいと思います。私はこれを行う上で何か問題に遭遇するでしょうか?1つの.cppファイルで複数のクラスを定義することは可能ですか?

+2

あなたは、あなたが好きなヘッダーであなたのクラスを入れて、その後のgcc -Eを実行し、インストラクターに出力を送信することができます。 (a)インストラクターがそれを読むことを拒否し、(b)標準ヘッダーからのすべての挿入が盗作警報を引き起こすので、実際にはしないでください。しかし、その出力を一度見て、それがコンパイル可能であることに注意すると、ヘッダーで行うことができるcppファイルで好きなことをすることができます。 –

+1

インストラクターが1つのファイルを提出するように要求している場合は、プログラミング言語でそのようなことが許されていると想定するのは妥当でしょうか?あなたはこの特別なことについてあなたのインストラクターを疑う必要がありましたか? –

+0

@Rob:私たちは答えを知っていますが、インストラクターは頻繁に "再帰呼び出しを使用せずにループのみ"という条件を課すことを考慮してください。 "再帰呼び出しのみを使用し、ループは使用しない";一般的には「片手で背中を背中に吊り下げて吊り下げる」などです。健全な教授の理由は間違いありませんが、あなたの前提が必ずしも正しかったり妥当なものではないことを意味します;-) –

答えて

25

(javaのように)従う必要はありません。あなたは好きな名前のファイルにクラスを置いて名前を付けることが自由です(接尾辞の他に)。

ただし、それが良い慣行であるかどうかは別の質問です(そうではありません)。

+1

これを追加するには、メインクラスの前に使用するクラスを配置する必要があること、またはコンパイラがそれらを見つけられないことを忘れないでください。この学校のプロジェクトは、拡張性の問題に苦しんでいる場合 – DaMacc

6

複数のクラスを1つのファイルに書き込む際に問題はありません。それはメンテナンススタイルの問題です。

3

単なるスケーラビリティ/保守性の問題;)厳密なルールはありません。

+6

(あなたは前方宣言を使用しない限り)通常のC++の免責事項は、あなたのコンパイラが受け入れるという理由だけで、それはだという意味ではありません」、適用されるものの は、チャドは彼の仕事;-) –

9

はい、できます。これは簡単に確認できます。

class C 
{ 
}; 

class D 
{ 
}; 

int main(int argc, char**argv) 
{ 
    return 0; 
} 
+6

のための給与をnegociateする必要がありますC++標準に従って許可されています」(この場合はもちろん完全に有効です) – jalf

+0

はい、良い点です。 –

3

いいえあなたは問題に遭遇しません。 C++では、1つのファイルの中に複数のクラスを定義することができます。

5

複数のクラスを同じファイル内で宣言して定義することができます。

しかし、クラスが後で提供される別のクラスに依存する場合、注意する必要があります。クラスAが別のクラスBのメンバである場合、コンパイラはその完全な宣言を必要とするため(そのサイズを知るように)、ファイルの上位に配置する必要があります。しかし、このメンバがポインタ(しかし指し示されたクラスのサイズに依存しないサイズを持つ)であるならば、指し示されたクラスの単純な前方宣言だけで十分です。

#includeメカニズムでは、とにかく起こることです:プリプロセッサは、すべてのファイルをコンパイル中のファイルに「コピー・ペースト」します。コンパイラには、まったく同じです。

3

1つのファイルに複数のクラスを定義する際に問題はありません。

これは、生産システムのために特に良い習慣ではありませんが、それははいことができます宿題

3

の問題ではありません。これは、ネストされたクラスを作成できないため、サポートする必要があります。

class outside 
{ 
public: 
     class nested 
     { 
     public: 
      static int x; 
      static int y; 
      int f(); 
      int g(); 
     }; 
}; 
4

通常、あなただけのクラスが非常に密接にリンクされている...場合は、単一のファイルに

  1. を複数のクラスを置く必要があります。たとえば、あるクラスが独自のイテレータを定義している場合、そのイテレータクラスを反復処理に使用されているクラスと同じファイルに配置することが適切な場合があります。

  2. クラスの1つは一般消費用であり、残りのクラスはそれを実装するために使用されます。たとえば、パブリッククラスに含まれる唯一のメンバーがプライベートクラスへのポインタである場合、 "pimpl"イ​​ディオムを使用する場合はこれが適用されます。この場合、private/hiddenクラスを使用するパブリッククラスに対応するソースファイルにprivate/hiddenクラスを配置することが適切な場合があります。どちらの場合も

、(例えば、イテレータ)と「プライベートヘルパー」「公共のヘルパーを」置くべきかどうかの決定(例えば、pimpl)クラスは、プロジェクト全体に対して一度作成し、一貫して従う必要があります。

+0

私はあなたの答えが好きです。なぜなら、それは議論の余地があることです。反復子の例は、私は確かに同意します。私がこれを見たのは、私がアプリケーションの設定のためにQtのタブ付きダイアログウィンドウを作っていて、タブ用のクラスとクラスのクラスが必要なためです。私はファイルにタブを分割するためにもっと暖かく議論しているが、私は本当にそのための私のファイル構造の場所を持っていない。 – Lightbulb1

2

質問は、Java/C#スタイルのソース表現から来ています。 C++では、ソースコードのレイアウトは非常に異なります。 1つのソースユニット/ "cppファイル" /あなたが入れたい宣言を多く扱うことができます。しかし、ある時点で他のクラスにあなたのクラスに対処する方法を教える必要があるので、それは良い戦略ではありません。 C++では、クラスは分離された定義と宣言セクションを持つことができ、それらを異なるファイルに配置することができます。クラスの定義は、他のソースファイルと#include文で共有されるため、定義が必要なシナリオでこれらのクラスを使用できます。 1つのソースファイルでのみ使用されるクラスを扱う場合は、ソースファイルに直接隠すことができますが、他のクラスにそれらを接続する場合は、ヘッダファイルに定義を入れる必要があります。

コンパイル速度を改善するのに役立ちます。特に、コンパイル済みヘッダーを使用しているが、paresがC++標準の一部ではなく、すべてのコンパイラーが別の方法でそれらを扱うため、注意が必要です。 - あなたのコードの柔軟性。あなたの教師はこれらの事実を認識しておく必要があり...

2

はい、あなたは問題なくそれを行うことができます。複数のクラスまたはネストされたクラスのいずれかです。

関連する問題