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的成员,然后再继承剩下的graph部分。

这是不可能的。基类总是在数据成员之前初始化。但是,在构造过程中,您分配给成员的值仅取决于构造函数参数,因此基类的构造函数参数也仅取决于这些参数。

假设您有成员m1并且m2想要使用依赖于这两个成员的值来初始化基类,比如f(m1,m2)g(m1,m2)。您的构造函数具有参数a, b,并且您使用和c初始化m1m2依赖于这些 ctor 参数。那么ctor应该是这样的:x(a,b,c)y(a,b,c)

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 回答