C++ 什么时候允许将默认构造函数设为私有

C++ 什么时候允许将默认构造函数设为私有,c++,constructor,C++,Constructor,我有两个类,一个允许将唯一显式声明的构造函数、无参数的构造函数设置为私有。我最近添加了另一个类,但由于将无参数构造函数设置为私有,因此出现编译时错误。唯一的区别是前者有一个公共静态工厂方法,而后者有一个接受参数的非静态构造函数 谢谢,希望这有点道理 好的,我给你一些代码: 这不会编译: class GridElem { public: GridElem(const char _idata); ~GridElem(); private: GridElem(); } 这并不

我有两个类,一个允许将唯一显式声明的构造函数、无参数的构造函数设置为私有。我最近添加了另一个类,但由于将无参数构造函数设置为私有,因此出现编译时错误。唯一的区别是前者有一个公共静态工厂方法,而后者有一个接受参数的非静态构造函数

谢谢,希望这有点道理

好的,我给你一些代码:

这不会编译:

class GridElem {
public:
    GridElem(const char _idata);
    ~GridElem();
private:
    GridElem();
}
这并不编译:

class GridElem {
public:
    GridElem(const char _idata);
    ~GridElem();
    GridElem();
}
class MyClass {
public:
    ~MyClass();
private:
    MyClass();
这并不编译:

class GridElem {
public:
    GridElem(const char _idata);
    ~GridElem();
    GridElem();
}
class MyClass {
public:
    ~MyClass();
private:
    MyClass();
抱歉,这不是一个完整的例子,但我相信这说明了异常的产生,可能是由于扩展了
cocos2d::Layer

编辑

好的,我找到了正在执行此操作的调用(eclipse找不到它:()

在标题中

GridElem myGrid[15][15]

在cpp文件中

MyClass::MyClass():myGrid{0}{}


我最近才将它从一个较小的网格改为显式地给出每个元素(因为它仍然是0,因为需要更多信息),我认为现在必须扩展到无参数的c'tor。对不起,我完全忘记了这一点,但这并不是100%明显的错误。

将默认构造函数设为私有通常意味着您需要所有

创建一个工厂。所以使用该工厂,或者将其公开

您可以始终将默认构造函数设置为私有(或者根本没有默认构造函数)

您不能使用来自类(或其朋友)外部的私有默认构造函数

您没有提供足够的上下文来确定,但我怀疑您的问题在于代码中的其他内容试图默认构造
GridElem
,因此它需要是公共的

唯一的区别是前者有一个公共静态工厂方法,而后者有一个接受参数的非静态构造函数


如果
MyScene
有一个工厂方法,那么它就是一个成员,可以调用私有的默认构造函数。没有“异常”,您刚才说过这两种类型只能由它们自己的成员函数(和朋友)默认构造,但其中只有一个具有成员函数来实际执行此操作。

其他构造函数如何?如果默认构造函数是私有的,您不能在没有完整代码和错误消息的情况下从外部使用它,因为它不确定您在问什么(哪个构造函数初始值设定项列表?!为什么不显示相关代码而不是让人们猜测?!)但是数组通常会使用默认构造函数。我找到了(我认为)对任何
GridElem
c'tor的唯一引用,并将其放在OP中。是的,
MyGrid{0}
将使用
GridElem{0}初始化数组的第一个元素
和使用默认构造函数的其他224个元素。