我收到一条未定义的引用错误消息,在此声明中:
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;
}
答案 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;