1

C++ の概念を理解するのに苦労しています。

メンバーポインターとメンバー変数を使用するのが適切なのはいつですか?

Nodeツリー構造とクラスがあるとしましょう。Data私の直感は、そのandに変数を使用することですEdge( がNode「所有」しているため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 のエッジは、「ゼロ」エッジとして完全に理にかなっていると思います。

コンストラクターのデフォルト値を定義する方法を 1 つだけ挙げました。このトピックに関する追加の議論がここにあります

于 2012-11-22T17:24:25.290 に答える
1

Nodeクラスの「カスタムクリエーター」メソッド(正しくは「コンストラクター」と呼ばれる)が実行されると、そのメンバーNode自体がオブジェクト(つまり、ポインターではなくint、float、charsなどの基本型ではない)であるメンバーは、独自のコンストラクターを実行します。

したがって、オブジェクトの初期値は、クラスedgeのコンストラクターが行うことによって決定されます。クラスコンストラクターが引数を必要とするEdge場合、コンストラクターはそれらを提供する必要があります。EdgeNode

たとえば、Edgeコンストラクターが次のような整数を必要としているとしweightます。

class Edge {
  public:
    Edge(int w)
      : weight(w) {
    }

  private:
    int weight;
};

次に、このエッジにデフォルトの重みを与えるための2つのオプションがあります。エッジコンストラクターにこのパラメーターのデフォルト値を与えることができます。

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 に答える