我正在尝试确保一个模块只加载一次但是当我按照我的方式执行时,编译器吐出“对我的两个静态类变量的未定义引用: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)的任何想法?
答案 0 :(得分:1)
您应该在使用之前定义您的静态变量。
添加
int Text::Instancese = 0 // whatever value you need.
位于.cpp
文件的顶部。
答案 1 :(得分:1)
类定义声明两个静态数据成员Text::Instances
和Text::Module
。如果代码实际使用它们,您还必须定义这些数据成员。就像void f();
声明一个函数一样,除非你定义,否则你不能调用它。所以添加:
int Text::Instances;
HMODULE Text::Module;
到你的源代码。 (这与您当前的代码是完全写在标题中还是分成标题和源代码无关;如果您使用它,则必须定义它)