我在C ++库中遇到了以下结构:
在myClass.h中
class myClass {
public:
static myClass* Instance();
.
.
private:
static myClass* _instance;
.
.
};
和myClass.cpp
myClass* myClass::_instance = NULL;
// followed by the all other functions..
myClass::myClass() {
.
.
}
myClass* myClass::Instance() {
if (_instance == NULL) {
.
.
}
.
.
}
那么在任何函数之外使_instance成为NULL指针的用途是什么?这段代码何时执行?
谢谢。
编辑: 添加主要功能。 myClass.cpp中的实例函数检查指针的值。仍然不明白指针何时被设置为NULL。
int _tmain(int argc, T_CHAR* argv[]) {
myClass* instance = myClass::Instance();
.
.
.
return 0;
}
答案 0 :(得分:1)
if (_instance == NULL)
在函数中正常工作。
我不确定这是怎么回事,但这是可能的。
答案 1 :(得分:1)
那么在任何函数之外使
_instance
成为NULL指针有什么用呢?
静态数据成员通常必须在包含其类的命名空间中在一个源文件中定义;它们受一个定义规则的约束,因此在任何使用它们的程序中都必须有一个定义。这就是定义。
使用NULL
初始化它确保它最初为空,以便Instance()
函数可以确定是否已创建实例。这并非严格必要,因为与所有静态变量一样,无论您是否明确提供初始化,它都将为零初始化。
这行代码何时执行?
在静态初始化期间,在程序中的任何其他代码之前;因为它是一个具有常量初始化的普通类型。
答案 2 :(得分:0)
静态关键字表示由类实例化的所有对象共享它。因此,您需要在任何函数之外初始化它.Static声明它是在类的所有实例之间共享的类变量。它与实例变量相反,每个实例都有自己的副本。要访问类变量,有两种方法。 1)a_class :: static_variable 2)a_class a; a.static_variable。初始化必须在源文件(.cpp)中而不是在头文件中。 因为它是一个静态变量,所以编译器只需要创建一个副本。如果您没有,则会收到链接错误。如果它在标题中,您将在包含标题的每个文件中获得一个副本,因此从链接器中获取多个定义的符号错误。
静态数据成员不是给定类类型的对象的一部分;它们是独立的对象。因此,静态数据成员的声明不被视为定义。数据成员在类范围内声明,但定义在文件范围内执行。
答案 3 :(得分:0)
myClass* myClass::_instance = NULL;
代码尝试初始化静态成员变量。
答案 4 :(得分:0)
它是一个初始化,确保指针从程序的最开始以值NULL
开始生命。 1
在程序中稍后将某个有用的指针值分配给它之前,它会使指针无效,但可识别的和可测试的值。这样,您就可以安全地测试指针,看看它是否已经被赋予了有用的值。
在这种情况下,由于您正在显示单身,"以后"表示"首次请求myClass
的实例时#34;使用一些你未展示的myClass::getInstancePlease()
函数。
更常见的是使用函数 - static
实例实现单例,而不是指向某些[可能是动态分配的]实例的类 - static
指针。
1 作为具有静态存储持续时间的对象,无论如何都会这样做;因此,除了记录程序员之外,这种初始化实际上是完全没有意义的。意图。子>