2

myGraphから派生したという名前のクラスがありますgraph

コンストラクターを呼び出すときに頂点の数がわかっている場合は、次のコンストラクターを使用できます。

myGraph(int numOfV) : graph(numOfV)
{
    // initialize...
}

graph コンストラクターで頂点の数を計算し、コンストラクター内で継承したいと考えています。その方法は?

myGraph(int a, int b)
{
    /* using a,b to initialize...  
       a sequence of push operation on (vector<T>)verticeList */

    int numOfV = this->verticeList.size();
    // inherit...
    myGraph(numOfV);  // it will not work


}

その点に注意してください

  1. 頂点の数を計算するために使用する手順は複雑です (ではなく、多くのコード行a+b) 。

  2. 頂点の数は のインスタンス変数に依存するmyGraphため、最初に のメンバーを初期化してからmyGraph、残りのgraph部分を継承する必要があります。

4

4 に答える 4

3

事前初期化で多くのロジックが実行されている場合は、メソッドでそれを分離できます。

struct myGraph
{
    myGraph(int a, int b) : graph(myGraph::computeNoVertices(a,b))
    {
    }
    static int computeNoVertices(int a, int b)
    {
        //whole chunk of code 
    }
};
于 2013-06-06T03:19:47.520 に答える
2

派生クラスのメンバー初期化リストで基本クラスのコンストラクターを呼び出す必要があります。

 myGraph(int a, int b) :graph(a +b)
 {                     //^^It is OK to do computation when you pass parameters to
                       //base class constructor
    // do something...
 }
于 2013-06-06T03:12:33.223 に答える
1

C++11 では、これを限定的に行うことができます。

myGraph(int a, int b)
  : myGraph(a+b)
{
}

計算がはるかに複雑な場合は、それらを別の関数に分割する必要があります。

myGraph(int a,int b)
  : myGraph(calculateNumOfV(a,b))
{
}
于 2013-06-06T03:17:10.183 に答える
0

頂点の数は myGraph のインスタンス変数に依存するため、最初に myGraph のメンバーを初期化してから、残りのグラフ パーツを継承する必要があります。

それは不可能です。基本クラスは、常にデータ メンバーの前に初期化されます。ただし、構築中にメンバーに割り当てる値はコンストラクター引数のみに依存するため、基本クラスのコンストラクター パラメーターもそれらの引数のみに依存します。

メンバーがm1ありm2、これら 2 つのメンバーに依存する値で基本クラスを初期化するとします。たとえばf(m1,m2)、 とg(m1,m2)です。コンストラクターにはパラメーターabcあり、これらの ctor 引数を初期化m1し、m2依存しx(a,b,c)ますy(a,b,c)。次に、ctor は次のようになります。

class Foo : Bar {
  int m1;
  int m2;
  static int x(int a, int b, int c);
  static int y(int a, int b, int c);
public:
  Foo(int a, int b, int c) 
    : Bar( f(x(a,b,c), y(a,b,c)), g(x(a,b,c), y(a,b,c)) )
    , m1(x(a,b,c))
    , m2(y(a,b,c)) 
  {}
};

もちろん、読みやすさを向上させるために、いつでも静的関数を作成して、ベース オブジェクトの初期化子を計算できます。

class Foo : Bar {
  /* ... */
  static Bar calcBar(int a, int b, int c) {
    int i1 = x(a,b,c);
    int i2 = y(a,b,c);
    return Bar(f(i1,i2), g(i1,i2));
  }

public:
  Foo(int a, int b, int c) 
    : Bar( calcBar(a,b,c) )
    , m1(x(a,b,c))
    , m2(y(a,b,c)) 
  {}
};
于 2013-06-06T06:32:08.880 に答える