Инициализация членов класса

Я объяснил в комментариях к этому коду мою проблему. Компилятор жалуется, что 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 ответа

Решение

Так как ваш Node не имеет конструктора по умолчанию, вам нужно вызвать правильный Node конструктор в списке инициализатора конструктора класса контейнера.

Один из способов решения вашей проблемы (вам необходимо выполнить некоторые вычисления для Node) - это перенести эти вычисления в сам конструктор Node и передать входные данные в Node конструктор. Другой способ - создать функцию внутри Tree который будет выполнять вычисления и вызывать функцию в списке инициализатора.

Вот пример второго подхода:

Tree::Tree(int arg) : Node(calc_node_arg(arg)) {}

Если вам нужно рассчитать i для инициализации, почему бы не определить функцию для этого:

например

class Tree {
  // As before

  static int DoCalc() {
    int i = 0;
     // some maths to calculate i;
     return i;
};

затем

Tree::Tree() : root(DoCalc()) { }

Используйте список инициализатора члена:

Tree.cpp

#include "Tree.h"

Tree::Tree() : root(1) {
}

В противном случае сгенерированный компилятором код пытается создать конструкцию по умолчанию root что на самом деле невозможно.

Другие вопросы по тегам