2013-03-24 197 views
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; 
} 

任何想法,爲什麼它說未定義參考兩個變量(實例&模塊)?

+0

定義和類的實現是在同一個文件中還是在單獨的文件?錯誤消息指向哪裏? – gongzhitaao 2013-03-24 02:57:46

+0

它指向包含該類定義的Cpp文件。標題和cpp文件是分開的。不提供行號。 – Brandon 2013-03-24 03:01:58

+0

[未定義的引用靜態變量]的可能的重複(http://stackoverflow.com/questions/14331469/undefined-reference-to-static-variable) – jogojapan 2013-05-30 14:37:57

回答

1

你應該在你的定義您的靜態變量,然後才能使用它。

添加

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

頂部你的.cpp文件。

+0

哇..那工作..雖然:爲什麼不理解爲什麼你要在實現文件中聲明一個變量。我從來沒有見過這個。 – Brandon 2013-03-24 03:07:21

+0

@CantChooseUsernames這是C++ :)我認爲任何關於C++的介紹都有一個解釋:D google它。 – gongzhitaao 2013-03-24 03:08:59

+2

@CantChooseUsernames你不*聲明*它 - 你*定義*它。 – 2013-03-24 03:09:02

1

該類定義聲明兩個靜態數據成員Text::InstancesText::Module。如果代碼實際使用它們,您還必須定義這些數據成員。就像void f();聲明一個函數,但是你不能調用它,除非你也是定義爲它。所以加上:

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

到你的源代碼。 (這與你的當前代碼是完全寫在一個頭文件中還是分成頭文件和源代碼無關;如果你使用它,你必須定義它)

+0

謝謝。我糾正了我的答案。 – gongzhitaao 2013-03-24 15:16:44