代码之家  ›  专栏  ›  技术社区  ›  Jack BeNimble

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

  •  2
  • Jack BeNimble  · 技术社区  · 17 年前

    我在以下语句中收到一条未定义的引用错误消息:

    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 回复  |  直到 17 年前
        1
  •  4
  •   DeusAduro    17 年前

    您是否正在尝试实现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()”运算符。

        2
  •  3
  •   Jay Conrod    17 年前

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

    GlobalClass* GlobalClass::s_instance = 0;
    

    重要的是不要添加 static 这个定义的修饰符(尽管你仍然应该有 静态 .h文件中类内声明的修饰符)。标记类外的定义时 静态 静态 不同于 静态 在课堂内,从 静态 在一个函数内部。我不知道为什么语言设计师对三种不同的东西使用相同的关键字,但事实就是这样。

        3
  •  0
  •   Aragorn    17 年前

    GlobalClass::s_instance = 0;
    
    推荐文章