静态变量未定义参考

时间:2013-03-24 02:47:08

标签: c++

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

为什么它说明未定义引用BOTH变量(Instances& Module)的任何想法?

2 个答案:

答案 0 :(得分:1)

您应该在使用之前定义您的静态变量。

添加

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

位于.cpp文件的顶部。

答案 1 :(得分:1)

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

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

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