8

私はC++が初めてです。C++ の複数定義エラーについて疑問があります。

プログラムに 3 つのファイルがあるとします。1 つのヘッダー ファイルと 2 つの .cpp ファイル。両方の .cpp ファイルにヘッダー ファイルを含めました。

  1. ヘッダー ファイルでクラスを宣言し、まったく同じ方法で各 .cpp ファイルでクラスを定義しました。このタイプの実装では、複数定義エラーが発生しますか? もしそうなら、クラス定義の 2 つのコピーがあり、コンパイラは 2 つの .o ファイルのリンケージ中にどちらを使用するかを認識していないためですか?

ヘッダー ファイルで使用し、そのうちの 1 つのファイルでのみクラスを定義することで、この問題を解決できexternますか?この方法を使用して問題を解決できる場合、.cpp (クラス定義を含む) を他の .cpp ファイルに含める必要がありますか? (クラス定義なし)?

  1. ヘッダー ファイルでクラスを宣言および定義しました。この場合は上記(1で述べた)と同じですか?

  2. ヘッダー ファイルでクラスを宣言し、各 .cpp ファイルでクラスを定義しましたが、定義 (関数本体) が異なります。このタイプの実装では、複数定義エラーが発生しますか? もしそうなら、関数本体が .cpp ファイルで異なるこの問題をどのように解決できますか?

4

4 に答える 4

13

1) 1 つの cpp ファイルで「クラスを定義する」ことでこれを解決します。なぜ2つのファイルで定義したいのですか?

2) ヘッダー ファイルで定義しないでください。宣言するだけです。この規則には、インライン関数などの例外があります。また、クラス自体を複数回定義することもできます (これは、クラスのメソッドとデータ メンバーを宣言する (つまり、 を記述する) ことを意味しますclass XYZ { ... };) が、各定義は同一である必要があります。これを実現する最も簡単な方法は、ヘッダー ファイルでクラスを 1 回定義することです。 . 次に、そのヘッダー ファイルを複数の場所にインクルードした結果の各定義は、必然的に同一になります。

3) これはさらにばかげています。何かを 2 回定義することは 1 つのことですが、それを 2 回定義し、毎回異なる方法で定義することは、さらに意味がありません。

問題は、物事を複数回定義する必要がある場合があると考える理由だと思います。そうしないでください。

また、「クラスを定義する」という意味を明確にする必要があります。これは、クラスのメソッドと静的メンバーを定義することを意味します。しかし、何か他のことを念頭に置いていると、混乱の原因になる可能性があります. いつものように、この種の用語の混乱を避ける最善の方法は、コードを投稿することです。

于 2013-09-20T10:18:22.580 に答える
1

1) プロジェクトで同じクラスの 2 つの定義を持つことはできません。そして、あなたがそれをどのように使うつもりなのか、私にはわかりません。1 つのクラスのインスタンスを異なる動作で作成する場合は、次のような仮想関数を使用します。

class A {
public:
    virtual int foo() = 0;
}

class B : public A {
public:
    virtual int foo() { return 1; }
}

class C : public A {
public:
    virtual int foo() { return 2; }
}

2) ヘッダー ファイル (Java スタイル) でクラスを定義することもできますが、このヘッダーを含めて他のファイルを構築するためにコンパイラがより多くのリソースを消費するため、これは最善の方法ではありません。コンパイラを高速に動作させる - .cpp ファイルでクラスを定義します。

3) 1ページ参照

于 2013-09-20T10:22:50.820 に答える