何时允许将默认构造函数设为私有?

When is it permitted to make the default constructor private

本文关键字:构造函数 默认 何时允      更新时间:2023-10-16

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

谢谢,希望这对你有意义。

好的,我给你一些代码:

这不能编译:

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();

不是一个完整的例子,抱歉,但我相信这显示了异常出现的地方,可能来自扩展cocos2d::Layer ?

编辑

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

在头

GridElem myGrid [15] [15],

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

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

你可以将默认构造函数设为私有(或者根本没有默认构造函数)。

你不能做的是在类(或它的友类)之外使用私有默认构造函数。

你没有提供足够的上下文来确定,但我怀疑你的问题是你代码中的其他东西试图默认构造一个GridElem,所以它需要是公共的。

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

如果MyScene有一个工厂方法,那么它是一个成员,可以调用私有默认构造函数。没有什么"异常",您刚才说这两种类型都只能由它们自己的成员函数(和友元)默认构造,但它们中只有一个具有实际做到这一点的成员函数。

将默认构造函数设为私有通常意味着您需要所有
创造要经过一个工厂。所以使用factory,或者将其设为public