我一直试图在C ++中实现单例类。
#include<iostream>
using namespace std;
class Singleton {
private:
static Singleton* singleton;
public:
static Singleton& Get() {
return *singleton;
}
static void display() {
cout << "Hello world\n";
}
};
Singleton* Singleton::singleton = nullptr;
int main() {
Singleton::Get().display();
return 0 ;
}
程序运行正常。 任何人都可以帮助我了解如何取消引用nullptr并在类的“获取”功能中返回对象引用。
答案 0 :(得分:4)
这由core language issue 315: Is call of static member function through null pointer undefined? 覆盖:
要考虑的另一个实例是调用成员函数的实例 从空指针开始:
struct A { void f () { } }; int main () { A* ap = 0; ap->f (); }
在12.2.2中明确指出未定义 [class.mfct.non-static],即使有人会争辩说因为f()是 空,没有左值->右值转换。
但是,如果f为静态,则似乎没有这样的规则,因此调用 仅在->运算符中隐式取消引用为 未定义。 IMO应该是。
顺便说一句,应该清理的另一件事是 “间接”和“取消引用”的用法不一致。我们应该选择 一。 (此术语问题已分解为问题342。)
这与issue 232有关。
,回复为:
我们同意应允许使用该示例。根据8.2.5 [expr.ref],p-> f()被重写为(* p).f()。如果p为null,除非将左值转换为右值(7.1 [conv.lval]),否则* p不是错误。
答案 1 :(得分:0)
基本上,这是因为Singleton
中的所有内容都是静态的。添加数据元素并对其进行处理,您将更有可能发现问题。