1

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

什么时候使用成员指针和成员变量比较合适?

假设我有一个树结构,因此有一个Node类。我的直觉是为其Dataand使用一个变量Edge(因为Node“拥有” the Data)和一个指向 parent 的指针Node。它是否正确?

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

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

但是我该怎么处理这个Edge变量?根Node没有父级,也没有Edge从其父级指向它。我可以以某种方式将其设置为“零”值吗?如果重要的话,Edge该类没有默认构造函数,而是像这样:Edge(int length, int width).

4

2 回答 2

2

有关成员指针与成员变量的适当使用,请参阅此讨论

现在,Edge对于“零”值,您可以对类执行以下操作:

将构造函数更改为Edge

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

这样,当使用(或隐式使用)Edge默认构造时,将匹配该构造函数并使用指定的默认值。Edge e1Node n1

我会说长度为 0 和宽度为 0 的边缘作为“零”边缘非常有意义。

我只列出了一种为构造函数定义默认值的方法。这里有关于这个主题的额外讨论

于 2012-11-22T17:24:25.290 回答
1

当类的“自定义创建者”方法(正确地称为“构造函数”)Node运行时,其任何成员Node本身都是对象(即不是整数、浮点数、字符和指针等基本类型)将运行它们自己的构造函数。

所以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;
};
于 2012-11-22T17:36:24.180 回答