【发布时间】:2020-11-08 22:54:21
【问题描述】:
假设我有一个带有私有构造函数的类,该类将用于表示单个对象。假设我有一些非静态成员,我想在不使用范围解析运算符的情况下访问它们。我注意到我可以通过创建指向类类型的指针来实现这一点。我想知道为什么即使默认构造函数是私有的,我也可以声明指向该类的指针?这是一个示例程序。
// Example program
#include <iostream>
#include <string>
class OnlyOne{
public:
void Location(){
std::cout<<10<<std::endl;
}
private:
OnlyOne();
};
int main()
{
//does not work Location() is not a static member
//OnlyOne::Location();
// doesn't work because default constructor is private.
//OnlyOne one;
//one.Location();
OnlyOne* two=nullptr;
two->Location();
}
我一直在网上寻找是否可以找到答案,但无法获得我想要的东西。
【问题讨论】:
-
您可以声明甚至没有构造函数的类型的指针,例如联合。声明一个指针是一回事,但实例化是另一回事。
-
注意:您可能会发现
OnlyOne* two=nullptr; two->Location();似乎按预期运行。 undefined behaviour 几乎无限可能的表现之一是预期的行为。真正讨厌的东西,UB,因为很容易证明你拥有它,而很难证明你没有。在这种情况下,Location不使用调用它的OnlyOne,从不使用this,因此程序可能永远不会注意到有一个错误的this。 -
如果我理解正确,Ali Askari 给出的解决方案通过使用单例模式解决了这个问题。
标签: c++ c++11 pointers language-lawyer private-constructor