将“零”值设置为成员变量

时间:2012-11-22 17:06:54

标签: c++ oop class constructor member-variables

我无法理解一些C ++概念。

什么时候使用成员指针和成员变量?

假设我有一个树结构,因此我有一个Node类。我的直觉是使用变量DataEdge(因为Node“拥有”Data)和指向父Node的指针。这是对的吗?

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

当我为Node类实现自定义创建者方法时,我还必须初始化成员变量(但不是指针?)。对于根Node,我可以将父指针设置为NULL

但是我如何处理Edge变量呢?根Node没有父级,也没有Edge从其父级导向它。我可以以某种方式将其设置为“零”值吗?如果重要,Edge类没有默认构造函数,但是类似这样的内容:Edge(int length, int width)

2 个答案:

答案 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;
};