【问题标题】:Set "zero" value to member variable将“零”值设置为成员变量
【发布时间】:2012-11-11 02:57:54
【问题描述】:

我无法理解一些 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)

【问题讨论】:

  • Edge 代表什么?它是如何定义的?
  • @Jawap 为什么不在Edge 类中添加构造函数Edge() 来将边初始化为零。构造函数重载!
  • @larsmans 节点与其父节点之间的边。它存储有关边的属性,例如长度、名称。
  • @GrijeshChauhan 如何将其初始化为零?是否必须添加成员变量 isZero 并将其设置为 true?
  • @Jawap :在 Edge 类中再添加一个构造函数。 Edge(){ this->length=0; this->width=0; } 但@sampson-chen 给出了更好的解决方案。以及称为函数参数默认初始化的概念。

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


【解决方案1】:

有关成员指针与成员变量的适当使用,请参阅this discussion

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

Edge的构造函数改为:

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

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

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

我只列出了一种为构造函数定义默认值的方法。有additional discussion on the topic here

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2021-12-29
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多