我在这段代码的评论中解释了我的问题。编译器抱怨root
未初始化,但我在构造函数的括号中初始化它。如果我还使用了initialization list
,那么我会将其初始化为两次而不是一次?如何正确设计?
tree.h中
class Tree
{
public:
Tree();
~Tree();
private:
struct Node
{
Node(int i);
int i;
};
Node root;
};
Tree.cpp
#include "Tree.h"
Tree::Tree() // <---- Complains that root isn't initialized
/* An initialization list here fixes the problem, however
* that wouldn't be convinient because I need to calculate the arguments of
* the Node first... So if I used both an initializer list here
* and then I also initialize the root AGAIN in the brackets bellow,
* wouldn't I be executing more code for no reason ?
*/
{
root = Node(1); // initialize root
}
Tree::~Tree()
{ }
Tree::Node::Node(int i) :
{
i = 1;
}
答案 0 :(得分:7)
由于Node
没有默认构造函数,因此需要在容器类构造函数的初始化列表中调用正确的Node
构造函数。
解决问题的一种方法(需要对Node进行一些计算)是将这些计算卸载到Node构造函数本身,并将输入数据传递给Node
构造函数。另一种方法是在Tree
内创建一个函数,它将执行计算并在初始化列表中调用函数。
以下是第二种方法的示例:
Tree::Tree(int arg) : Node(calc_node_arg(arg)) {}
答案 1 :(得分:2)
使用成员初始化列表:
<强> Tree.cpp 强>
#include "Tree.h"
Tree::Tree() : root(1) {
}
否则编译器生成的代码会尝试默认构造root
,这实际上是不可能的。
答案 2 :(得分:2)
如果您需要为初始化计算i
,为什么不定义一个函数来执行此操作:
e.g。
class Tree {
// As before
static int DoCalc() {
int i = 0;
// some maths to calculate i;
return i;
};
然后
Tree::Tree() : root(DoCalc()) { }