1

Linux static lib プロジェクトに 3 つのファイルがあり、2 つのクラス メソッド実装ファイルで使用したい静的フィールドでリンクの問題が発生しています。class1.h、class1main.cpp、class1utils.cpp があります。class1.h は class1 と呼ばれるクラスを定義し、すべての静的メソッドと pDb と呼ばれる静的フィールドを持ちます。.cpp ファイルは、2 つのファイルに分割された class1 メソッドの実装を定義します。

class1.h で、静的を宣言します。

class class1    {
public:
    static Database * pDb;
    ...
}

class1main.cpp では、上部に実際の静的を定義します。

Database * class1::pDb;

そのため、class1utils.cpp で次のことを実行できると考えました。

extern Database * class1::pDb;

しかし、プロジェクトを作成してライブラリを取り込むと、リンク時に pDb が複数定義されます。2番目のソースファイルで静的を参照して使用できるようにする方法を教えてもらえますか(リンクします)?

class1utils.cpp のメソッドを class1main.cpp に戻し、class1utils.cpp を取り除くと、リンクが機能します。

アドバイスをありがとう。コーリー。

4

2 に答える 2

4

class1.h を単純にインクルードする必要があります。変数を宣言するために他に必要なものはありません。

この理由の 1 つは、クラス定義が存在しない状態で静的メンバー変数を宣言できる場合、静的メンバーのアクセス指定子が非表示になることです。コンパイラはアクセス許可をチェックできません。

extern Database *class1::pDb;さらに、 class1 が既に定義されていないと、class1 のメンバーを参照することもできません ( のように)。試してみるとclass class1; Database *class1::pDb;、 undefined type を使用しているというエラーが発生するはずですclass1。したがって、extern 宣言は冗長です。


別の注意として、非静的メンバーを持たないクラスがある場合は、おそらくクラスを使用すべきではないことを示しています。C++ は、すべてがクラス内になければならない Java とは異なります。C++ では、必要に応じて名前空間で自由な関数と変数を簡単に宣言できます。

この場合、static を使用する代わりに、extern を使用して class1.h で変数を宣言します。

// class1.h
namespace class1 {
    extern Database *pDb;
}

// class1main.cpp
Database *class1::pDb;
于 2012-07-10T19:51:53.737 に答える
0

ヘッダーclass1.hにはすでに member の宣言が含まれていますclass1::pDb。を含む任意の実装ファイルでそのメンバーにアクセスできますclass1.h。追加の手順は必要ありません。

extern Database * class1::pDb別の実装ファイルで行うことにより、このメンバーを再宣言しようとしているようです。これは単に無効です。クラスのメンバーを宣言する唯一の方法は、完全なクラス定義を提供することです。

于 2012-07-10T20:13:24.920 に答える