gpt4 book ai didi

c++ - 在这种情况下我们可以避免使用默认构造函数吗?

转载 作者:行者123 更新时间:2023-11-27 23:11:17 25 4
gpt4 key购买 nike

观察:ClassMain的构造函数需要调用Init才能构造成员变量a。由于 ClassA 没有默认构造函数,因此代码无法编译。

ClassA
{
public:
// This class has no default constructor
ClassA(...){}
};

class ClassMain
{
public:
ClassMain(...) {
Init(...);
a = ClassA(...); // error: ClassA has no default constructor
// a has to been constructed after the Init is called!
}
ClassMain(...) {
Init(...);
call other functions
a = ClassA(...);
}

private:
// initialize environment
void Init(...) {}

private:
ClassA a;
};

问题> 简单的解决方案是为 ClassA 提供默认构造函数。但是,我想知道是否有更好的解决方案来解决上述问题?

最佳答案

更好的解决方案是根本不需要 Init 函数。您正在尝试重新发明构造函数,并在此过程中打破他们的设计。

如果 Init 为构造函数做了太多工作,则在外部进行,并将生成的资源作为构造函数参数传递给 ClassMain;请注意,无论如何,您已经在构造函数的范围内完成了所有工作,因此通过适当的初始化并没有获得任何可观的 yield 。

当然,如果您必须在初始化a 之前执行大量工作,并且您不能从外部传入ClassA& 并从中进行初始化,那么您我们只需要让 a 成为间接成员即可。

您可以使用 一个 讨厌的解决方法:让 Init 实际上是一个基础构造函数...

关于c++ - 在这种情况下我们可以避免使用默认构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20199758/

25 4 0
文章推荐: c++ - 试图替换 C++ 字符串中的字符,完全卡住
文章推荐: javascript - 如何在 ChromeWorker 中使用事件?
文章推荐: javascript - 为什么这不会从