未定义的引用 - C ++链接器错误

时间:2009-07-14 00:52:10

标签: c++ compilation

我收到一条未定义的引用错误消息,在此声明中:

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;
}

3 个答案:

答案 0 :(得分: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()'运算符。

答案 1 :(得分:3)

在.h文件中声明静态字段s_instance时,它只告诉编译器该字段存在于某处。这允许您的main函数引用它。但是,它没有在任何地方定义字段,即没有为它保留任何内存,也没有为其分配初始值。这类似于函数原型(通常在.h文件中)和函数定义(在.cpp文件中)之间的区别。

为了实际定义字段,您需要将以下行添加到全局范围内的.cpp文件中(不在任何函数内):

GlobalClass* GlobalClass::s_instance = 0;

重要的是不要将static修饰符添加到此定义中(尽管在.h文件中类的声明中仍然应该有static修饰符)。当类外的定义标记为static时,该定义只能在同一.cpp文件中使用。如果链接器在其他.cpp文件中使用,它将表现为不存在。 static的含义与类中的static和函数内的static不同。我不确定语言设计师为什么在三个不同的事情上使用相同的关键字,但事实就是如此。

答案 2 :(得分:0)

如果我明白你想做什么只是使用它的问题:

GlobalClass::s_instance = 0;