11

皆さん、こんにちは。

私は基本的なことに引っかかっているようですが、どこにも解決策が見つかりません。とにかく、先に進んで説明します。

3 つのファイルで構成されるプログラムがあります。main.ccp、add.h、add.cpp。

add.h でクラス 'SA' を宣言し、すべての関数を add.cpp で定義しています。

追加.h

class SA {
    ...
public
    int x;
} Obj1, Obj2;

main.ccp

#include "additional.h" 

int main() {

    Obj1.x = 5;

    ...
}

これにより、コンパイル時にリンク エラーが発生します。エラー LNK2005: "class SA Obj1" (?Obj1@@3VSA@@A) already defined in main.obj

オブジェクトの唯一の定義は add.h で発生し、他の場所では発生しません。ヘッダーではなくメインでオブジェクトを宣言すると、プログラムは問題なくコンパイルされます。

main.ccp

#include "additional.h" 

int main() {

    SA Obj1;
    Obj1.x = 5;

    ...
}

問題は、主に add.cpp 内でオブジェクトを使用したいが、main.cpp を介していくつかの公開値を初期化する必要があることです。知恵の言葉はありますか?

4

3 に答える 3

20

.h ではなく .cpp で Obj1 と Obj2 を宣言します。

add.h

class SA {
 ...
public
    int x;
};

main.cpp

#include "additional.h" 

SA Obj1, Obj2;

int main() {

 Obj1.x = 5;

 ...
}

.h ファイルで Obj1 と Obj2 を宣言する場合は、次のように .h ファイルに extern を追加します。

extern SA Obj1, Obj2;

ただし、プロジェクトの .cpp ファイルでオブジェクトを宣言する必要があります。

main.cpp

SA Obj1, Obj2;

これは、.h ファイルをインクルードするたびに、Obj1 と Obj2 を宣言しているためです。したがって、.h ファイルを 2 回含めると、Obj1 と Obj2 の 2 つのインスタンスが作成されます。キーワード extern を追加することで、プロジェクトのどこか (できれば .cpp ファイル) で 2 つの変数が既に宣言されていることをコンパイラに伝えます。

于 2009-03-11T07:29:46.963 に答える
7

externキーワードを使用します。これらのパブリック オブジェクトをヘッダーで extern として宣言し、cpp の 1 つでインスタンスを定義します。

このような:

extern SA Obj1; // in header

SA Obj1;// in any one (no more than one) cpp
于 2009-03-11T07:28:09.323 に答える
6

ヘッダー ファイルに次のコード行を含めることもできます。

static SA Obj1, Obj2;

これにより、実行時に各オブジェクトのインスタンスが 1 つだけ作成され、再定義が防止されます。ただし、.h ファイルを含むすべてのファイルは、これら 2 つのオブジェクトの同じインスタンスを使用するため、それらにアクセスするときは注意する必要があることに注意してください。

于 2010-02-25T16:47:11.157 に答える