【发布时间】:2014-03-25 18:39:41
【问题描述】:
我读到了在类中初始化的引用和对象。但是,除了提示之外,我找不到对以下问题的明确陈述:
如果没有默认构造函数(没有Object(){}),我可以在初始化列表中初始化成员对象obj1吗?
class Sample
{
private:
Object1 obj1(arguments);
public:
Sample(Object1 o1) : obj1( o1(arguments) )
{ }
};
问题出现了,因为如果有与此How can I initialize C++ object member variables in the constructor? 相关的问题。代码也是从那里获取的。感谢您的努力。
丹尼尔
编辑:
由于答案表明它有效,因此测试返回了一个错误(这正是我问这个问题的原因):
../src/Timestep.h:45:12: error: field ‘myFEMSolver’ has incomplete type FEMSolver myFEMSolver;
代码:
class Timestep {
public:
Timestep();
private:
FEMSolver myFEMSolver;
}
Timestep::Timestep() : myFEMSolver(*this)
{ //do some stuff
}
FEMSolver::FEMSolver(const Timestep& theTimestep) : myTimestep(theTimestep)
{ //do some stuff
}
main(){
Timestep myTimestep();
}
【问题讨论】:
-
该代码不会产生该错误。即,当
FEMSolver类本身被声明但在TimeStep被定义时未定义时,您会收到该错误。FEMSolver必须首先完全定义。这与初始化列表无关。 meta.stackexchange.com/questions/66377/what-is-the-xy-problem -
其实不是XY问题。最初的问题对于意识到我打算做的事情确实有效很重要。但你对宣言的看法是对的。我切换了标题,现在它可以工作了。非常感谢。
-
X 是“产生这种不完整类型错误的原因”。 Y 是“如果没有默认构造函数,我可以在初始化列表中初始化一个成员对象吗”这是非常一个 X/Y 问题。
标签: c++ class initialization