【问题标题】:C++: Calling a base class constructor with a computed argumentC++:使用计算参数调用基类构造函数
【发布时间】:2012-05-02 21:31:24
【问题描述】:

这个简单的例子演示了调用基类构造函数的 C++ 语法——据我作为 C++ 学习者的理解:

class BaseClass {
protected:
  int i;
public:
  BaseClass(int x) { 
     i = x; 
  }
};

class DerivedClass: public BaseClass {
  int j;
public:
  DerivedClass(int x, int y): BaseClass(y) { 
     j = x; 
  }

在这里,基类构造函数可以将命名参数作为派生类构造函数的输入。

现在,如果我想用不是DerivedClass() 的直接输入的输入值调用BaseClass() 构造函数怎么办?基本上,我想在DerivedClass() 中使用xy 做一些多行工作,然后将计算值传递给BaseClass()。这可以用构造函数来完成吗?是否应该使用某种初始化方法来代替?

【问题讨论】:

    标签: c++ oop constructor


    【解决方案1】:

    你可以这样做,是的:

    class BaseClass
    {
      public:
        BaseClass(int x) : i(x) {}
    
      private:
        int i;
    };
    
    class DerivedClass: public BaseClass
    {
      public:
        DerivedClass(int x, int y):
          BaseClass(compute(x, y)), // Neither i or j are initialized here yet
          j(x)
          {}
    
      private:
        static int compute(int a, int b) { return a + b; } // Or whatever
        int j;
    };
    

    请注意,您甚至可以将compute() 设为非静态方法,但请注意DerivedClassBaseClass 成员不会在调用时被初始化。所以你将无法依赖他们的价值观。

    【讨论】:

    • @Seth Carnegie:感谢缺少; 修复:D 我想我最近做的 Python 太多了。
    【解决方案2】:

    那么你可以这样做:

    DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) { 
         //j = x;  //use member-initialization-list ---> ^^^^
      }
    
    int compute(int x, int y) 
    {
         //your code
    }
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 C++11 或更新版本,您也可以使用 lambda 表达式:

      class BaseClass
      {
        public:
          BaseClass(int x) : i(x) {}
      
        private:
          int i;
      };
      
      class DerivedClass: public BaseClass
      {
        public:
            DerivedClass(int x, int y): BaseClass(
                [=]()->int
                  {
                      int sum = 0;
                      for(int i = 0; i < x; ++i)
                      {
                          sum += y + i * x;
                      }
                      return sum;
                  }()), j(x)
            {}
      
        private:
          int j;
      };
      

      【讨论】:

      • +1 用于提醒存在 lambda。但是如果计算量太大就不好了。很难阅读构造函数(恕我直言)。
      猜你喜欢
      • 1970-01-01
      • 2013-03-24
      • 2015-08-18
      • 2011-12-26
      • 2018-06-03
      • 2018-05-25
      • 2016-07-19
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多