Установить «ноль» значение переменной-члена

У меня проблемы с пониманием некоторых концепций C ++.

Когда уместно использовать указатель члена против переменной члена?

Допустим, у меня есть древовидная структура и, следовательно, Node учебный класс. Моя интуиция будет использовать переменную для его Data а также Edge (поскольку Node «владеет» Data) и указатель на родителя Node, Это правильно?

class Node {
public:
Data data;
Edge edge;
Node *parent;
}

Когда я реализую пользовательский метод создателя для Node класс, я также должен инициализировать переменные-члены (но не указатели?). Для корня Node Я могу установить родительский указатель на NULL,

Но что мне делать с Edge переменная? Корень Node не имеет родителей и нет Edge приводя к этому от своего родителя. Можно ли как-то установить его на «нулевое» значение? Если это имеет значение, Edge У класса нет конструктора по умолчанию, но что-то вроде этого: Edge(int length, int width),

1

Решение

Для правильного использования указателя члена и переменной члена см. это обсуждение.

Теперь вот что вы можете сделать с Edge класс по «нулевому» значению:

Изменить конструктор Edge читать:

Edge(int length=0, int width=0)

Таким образом, когда Edge по умолчанию построен с Edge e1 (или неявно с Node n1), этот конструктор будет сопоставлен, и будут использоваться значения по умолчанию, как указано.

Я бы сказал, что ребро длины 0 и ширины 0 имеет смысл в качестве нулевого ребра.

Я перечислил только один способ определения значений по умолчанию для конструктора. Есть дополнительное обсуждение по теме здесь.

2

Другие решения

Когда метод «Custom Creator» (правильно называется «конструктор») для Node класс работает, любые члены Node которые сами являются объектами (то есть не базовыми типами, такими как int, float, char и не указатели), будут запускаться их собственные конструкторы.

Таким образом, начальное значение edge объект будет определяться тем, что конструктор Edge класс делает. Если Edge Конструктор класса требует аргументов, затем Node Конструктор должен будет предоставить их.

Предположим, например, что Edge конструктор требует целое число weightНапример:

class Edge {
public:
Edge(int w)
: weight(w) {
}

private:
int weight;
};

Тогда есть два варианта придания веса по умолчанию этому ребру. Вы можете дать конструктору ребер значение по умолчанию для этого параметра:

class Edge {
public:
Edge(int w = 0)
: weight(w) {
}

private:
int weight;
};

В каком случае Node класс не нужно делать ничего особенного. Или вы можете иметь Node класс обеспечивает параметр, например:

class Node {
public:
Node()
: edge(0),
parent(NULL) {
}

Data data;
Edge edge;
Node *parent;
};
1

По вопросам рекламы [email protected]