2009-07-14 51 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。我不知道为什么语言设计师为三种不同的事情使用同一个关键字,但事实就是这样。

相关问题