初始化类的成员

时间:2016-04-29 20:16:11

标签: c++

我在这段代码的评论中解释了我的问题。编译器抱怨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;
}

3 个答案:

答案 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()) { }