c++ - 指向具有私有(private)构造函数的类的类成员的指针

标签 c++ c++11 pointers language-lawyer private-constructor

假设我有一个带有私有(private)构造函数的类,该类将用于表示单个对象。假设我有一些非静态成员,我想在不使用范围解析运算符的情况下访问它们。我注意到我可以通过创建一个指向类类型的指针来实现这一点。我想知道为什么即使默认构造函数是私有(private)的,我也可以声明指向该类的指针?这是一个示例程序。


// 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();
调用未定义的行为,因为 two 没有指向对象,因此没有可以调用 Location 的对象成员函数。
事实上,由于这种类型是不可构造的,two永远不能指向一个有效的对象。您必须提供一种方法来构造这样的对象,或者通过提供公共(public)构造函数,或者通过使用静态成员函数来构造并返回这样的对象。

关于c++ - 指向具有私有(private)构造函数的类的类成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62982677/

相关文章:

C++设置dll搜索位置

c++ - 为几个可能的参数(类型名)专门化类

c++ - 有不可变的 STL 容器类吗?

c++ - 删除抽象非虚拟 dtor C++

c++ - 如何避免包含文件因模板类而传播

C++ sleep 函数没有按预期工作

c++ - strrchr 导致 'Cannot convert from const char * to char *'

c - 检索与文件指针关联的文件的名称

C 编程 - 将结构成员变量分配给 char *

c++ - 如何在 DirectX 中绘制 2D 几何图形和 3D 对象? (D3D9)