У меня проблемы с пониманием некоторых концепций 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)
,
Для правильного использования указателя члена и переменной члена см. это обсуждение.
Теперь вот что вы можете сделать с Edge
класс по «нулевому» значению:
Изменить конструктор Edge
читать:
Edge(int length=0, int width=0)
Таким образом, когда Edge
по умолчанию построен с Edge e1
(или неявно с Node n1
), этот конструктор будет сопоставлен, и будут использоваться значения по умолчанию, как указано.
Я бы сказал, что ребро длины 0 и ширины 0 имеет смысл в качестве нулевого ребра.
Я перечислил только один способ определения значений по умолчанию для конструктора. Есть дополнительное обсуждение по теме здесь.
Когда метод «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;
};