0

モジュールが1回だけ読み込まれるようにしようとしていますが、それを自分のやり方で行うと、コンパイラは「両方の静的クラス変数への未定義の参照:S

class Text : public Parent
{
    private:
        static int Instances;
        static HMODULE Module;

    public:
        Text();
        Text(Text&& T); 
        Text(std::wstring T); 
        ~Text();

        virtual Text& operator = (Text&& T); 
};

Text::Text() : Parent() {}

Text::~Text()
{
    if (--Instances == 0)
        FreeLibrary(Module); // Only free the module when
                             // no longer in use by any instances.
}

Text::Text(Text&& T) : Parent(std::move(T)), Module(std::move(T.Module))

Text::Text(std::wstring T) : Parent(T)  // Module only loads when
                                        // this constructor is called.
{
    if (++Instances == 1)
    {
        Module = LoadLibrary(_T("Msftedit.dll"));
    }
}

Text& Text::operator = (Text&& T)
{
    Parent::operator = (std::move(T));
    std::swap(T.Module, this->Module);
    return *this;
}

両方の変数(インスタンスとモジュール)への未定義の参照を示す理由はありますか?

4

2 に答える 2

1

静的変数を使用する前に、で定義する必要があります。

追加

int Text::Instancese = 0 // whatever value you need.

ファイルの先頭にあり.cppます。

于 2013-03-24T03:01:39.393 に答える
1

クラス定義は、2つの静的データメンバーとを宣言します。コードが実際にそれらを使用する場合は、それらのデータメンバーも定義する必要があります。関数を宣言するのと同じですが、定義しない限り呼び出すことはできません。したがって、次を追加します。Text::InstancesText::Modulevoid f();

int Text::Instances;
HMODULE Text::Module;

ソースコードに。(これは、現在のコードが完全にヘッダーで記述されているか、ヘッダーとソースに分割されているかとは関係ありません。使用する場合は、定義する必要があります)

于 2013-03-24T12:54:30.863 に答える