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