2009-07-14 71 views
2

我得到一個未定義的引用錯誤訊息,在此聲明:未定義參考 - Visual C++鏈接錯誤

GlobalClass *GlobalClass::s_instance = 0; 

任何想法?代碼如下所示:

========================================= =======

#ifndef GLOBALCLASS_H_ 
#define GLOBALCLASS_H_ 

#include <string> 
class GlobalClass { 

public: 

    std::string get_value(); 

    void set_value(std::string); 

    static GlobalClass *instance(); 

    static GlobalClass *s_instance; 

private: 

    std::string m_value; 
}; 

#endif /* GLOBALCLASS_H_ */ 

==================================== ===========

#include <string> 
#include "GlobalClass.h" 



/* 
GlobalClass(int v = 0) 
{ 
m_value = v; 
} 
*/ 

    static GlobalClass *s_instance; 

    std::string GlobalClass::get_value() 
    { 
     return m_value; 
    } 

    void GlobalClass::set_value(std::string v) 
    { 
     m_value = v; 
    } 

    static GlobalClass *instance() { 
     if (!s_instance) 
      s_instance = new GlobalClass; 
     return s_instance; 
    } 

================================ ===========================

#include <iostream> 
#include "GlobalClass.h" 

using namespace std; 

int main() { 

    GlobalClass::s_instance = 0; 


    std::string myAddress = "abc"; 
    GlobalClass::instance()->set_value(myAddress); \\ <=== compiler error 
    std::cout << "====>address is is " << GlobalClass::instance()->get_value() 
      << std::endl; 
    return 0; 
} 
+1

你有兩個GlobalClass定義,一個沒有s_instance ...可能會導致混淆? – Eli 2009-07-14 00:54:59

+0

Doh,我複製了錯誤的文件 - 謝謝。 – 2009-07-14 01:08:12

+0

你一直在編輯正文。GlobalClass :: instance() - > set_value(myAddress)或GlobalClass * GlobalClass :: s_instance = 0是否出錯?目前尚不清楚。 – 2009-07-14 01:11:51

回答

4

你想實現一個Singleton類嗎? IE瀏覽器。您只需要該類的單個實例,並且您希望該實例可供包括該類的任何人使用。我認爲它通常被稱爲一個Singleton,下面的例子中按預期工作:

Singleton.h:

#include <string> 
class Singleton 
{ 
public: 
    static Singleton* instance() 
    { 
     if (p_theInstance == 0) 
      p_theInstance = new Singleton; 
     return p_theInstance; 
    } 
    void setMember(const std::string& some_string) 
    { 
     some_member = some_string; 
    } 
    const std::string& get_member() const 
    { 
     return some_member; 
    } 

private: 
    Singleton() {} 
    static Singleton* p_theInstance; 
    std::string some_member; 
}; 

Singleton.cpp:

Singleton* Singleton::p_theInstance = 0; 

main.cpp中:

#include <string> 
#include <iostream> 
#include "Singleton.h" 

int main() 
{ 
    std::string some_string = "Singleton class"; 
    Singleton::instance()->setMember(some_string); 
    std::cout << Singleton::instance()->get_member() << "\n"; 
} 

請注意,構造函數是私人的,我們不希望任何人創建我們的單例實例,你通過'instance()'操作符來保證它不失真。

0

如果我明白你想要做的只是一個usi的問題ng這個:

GlobalClass::s_instance = 0; 
3

當您在.h文件中聲明一個靜態字段s_instance時,它只會告訴編譯器該字段存在於某處。這使您的main函數可以引用它。然而,它沒有在任何地方定義字段,即沒有爲它保留存儲器,也沒有給它分配初始值。這類似於函數原型(通常在.h文件中)和函數定義(在.cpp文件中)之間的區別。

爲了真正定義字段,你需要下面一行在全局範圍內(內部沒有任何功能)添加到您的.cpp文件:

GlobalClass* GlobalClass::s_instance = 0; 

重要的是,你不加該定義的static修飾符(儘管在.h文件的類中的聲明中仍應該有static修飾符)。當類之外的定義標記爲static時,該定義只能在相同的.cpp文件中使用。如果鏈接器在其他.cpp文件中使用,則它的行爲就好像不存在一樣。這個static的含義不同於一個類中的static和一個函數內的static。我不知道爲什麼語言設計師爲三種不同的事情使用同一個關鍵字,但事實就是這樣。

相關問題