我无法理解一些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)
。
答案 0 :(得分:2)
要正确使用成员指针与成员变量,请参阅this discussion。
现在,您可以使用Edge
类关于“零”值进行操作:
将Edge
的构造函数更改为:
Edge(int length=0, int width=0)
这种方式当Edge
默认使用Edge e1
构建(或隐式使用Node n1
)时,将匹配该构造函数并使用指定的默认值。
我会说长度0和宽度0的边缘作为“零”边缘完全有意义。
我只列出了一种为构造函数定义默认值的方法。有additional discussion on the topic here。
答案 1 :(得分:1)
当Node
类的“自定义创建者”方法(正确称为“构造函数”)运行时,Node
的任何成员本身就是对象(即不是基本类型,如整数,浮点数, chars,而不是指针)将有自己的构造函数运行。
因此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;
};