0

我试图确保一个模块只加载一次,但是当我按照我的方式执行时,编译器会吐出“对我的两个静态类变量的未定义引用: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

类定义声明了两个静态数据成员,Text::Instances并且Text::Module. 如果代码实际使用它们,您还必须定义这些数据成员。就像void f(); 声明一个函数一样,但除非你也定义它,否则你不能调用它。所以添加:

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

到您的源代码。(这与您当前的代码是完全写在头文件中还是拆分为头文件和源代码无关;如果使用它,则必须定义它)

于 2013-03-24T12:54:30.863 回答
1

您应该先在您的静态变量中定义它,然后才能使用它。

添加

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

.cpp在您的文件顶部。

于 2013-03-24T03:01:39.393 回答