【问题标题】:Inherit constructor继承构造函数
【发布时间】:2013-06-01 22:23:06
【问题描述】:

我有一个名为myGraph 的类,它派生自graph

如果我在调用构造函数的时候知道顶点的个数,就可以使用下面的构造函数了。

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

我想计算构造函数中的顶点数,然后继承graphinside构造函数。该怎么做?

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部分。

【问题讨论】:

    标签: c++ class inheritance constructor


    【解决方案1】:

    顶点的数量取决于myGraph中的实例变量,所以我需要先初始化myGraph的成员,然后继承剩余的graph部分。

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

    假设您有成员 m1m2,并希望使用依赖于这两个成员的值来初始化基类,例如 f(m1,m2)g(m1,m2)。您的构造函数具有参数abc,并且您根据这些ctor 参数初始化m1m2,使用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)) 
      {}
    };
    

    【讨论】:

      【解决方案2】:

      如果有很多关于预初始化的逻辑,你可以在一个方法中将它们分开:

      struct myGraph
      {
          myGraph(int a, int b) : graph(myGraph::computeNoVertices(a,b))
          {
          }
          static int computeNoVertices(int a, int b)
          {
              //whole chunk of code 
          }
      };
      

      【讨论】:

      • 这通常是这类问题的答案。如果您还需要在初始化期间将其他成员用作左值,则可以将这些成员移动到私有基础结构中。
      【解决方案3】:

      使用 C++11,您可以做有限的事情:

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

      如果您的计算要复杂得多,您可能希望将它们分解为一个单独的函数:

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

      【讨论】:

      • 调用同一个类的另一个构造函数?委托?
      • 他想调用graph构造函数,而不是委托给另一个myGraph构造函数。
      • @Praetorian:也许吧,但他的例子让人觉得他想调用另一个构造函数。
      【解决方案4】:

      你必须在派生类的成员初始化列表中调用基类构造函数:

       myGraph(int a, int b) :graph(a +b)
       {                     //^^It is OK to do computation when you pass parameters to
                             //base class constructor
          // do something...
       }
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 2013-03-21
        • 2011-09-09
        • 2014-11-22
        • 2013-03-05
        • 2010-12-11
        相关资源
        最近更新 更多