C ++用参数

时间:2016-04-05 13:33:13

标签: c++ c++11 constructor initializer-list

这在C ++ 11中似乎不起作用:

class B : public A
{
  public:
    B(const A& a)
        : A(a)   // parent constructor for passing the parameter
        , B()    // delegating constructor for init of other members
    {};
  // ...
};

gcc告诉我an initializer for a delegating constructor must appear alone

如何用参数调用父类的构造函数,并调用B类的基本构造函数? (我在B中有一堆其他构造函数需要相同的行为)。

现在我正在考虑编写一个私有的B::init()函数,并在所有构造函数体中使用它,但这很有点像C ++ 03。

首选解决方案是什么?

2 个答案:

答案 0 :(得分:5)

我认为首选的委派方式是另一种方式,它不是用来重构构造函数的公共部分,而是将更简单的方法定义为更复杂的案例的特例

因此,您应该从Private sub CommandButton1_Click() shSource=WorkSheets("Sheet1") shDest=WorkSheets("Sheet2") LastRow = shSource.Range("A" & Rows.Count).End(xlUp).Row For i = 1 To LastRow Range("A1").Offset(4, 0).Select Selection.Copy shDest.Select shDest.Range("A1").Select If shDest.Range("A1").Offset(1, 0) <> "" Then shDest.Range("A1").End(xlDown).Select End If ActiveCell.Offset(1, 0).Select ActiveCell.Paste Next i End Sub 开始,并将其用作委派目标。

B(const A& a)

创建class B : public A { public: B() : B(A()); B(const A& a) : A(a) // parent constructor for passing the parameter {}; }; 时,您正在呼叫A()

背后的理由是,当你有两个&#34;部分专业化的&#34; c,你将无法使用它们来初始化复杂的那个。 E.g:

B

我相信技术原因在Bathsheba的答案中有所解释。看看如果你在class B : public A { public: B() {}; B(int) : B() {}; B(double) : B() {}; B(double,int) : B(int), B(double) {}; // can't do it. }; 中有一个共同的部分会发生什么:

B()

继承中已知的钻石问题。解决方案是扭转逻辑。

class B : public A
{
  public:
    B() {};
    B(int) : B() {};
    B(double) : B() {};
    B(double,int) : B(int), B(double) {}; //ooops would get B() called twice!
};

答案 1 :(得分:2)

B(const A& a) : A(a), B()没有意义,因为B() 初始化基类A。这基本上是一个重复的初始化,这是一个固有的矛盾。

该语言唯一真正的选择是,如果使用委托构造函数,则禁止其他任何操作。那是你的编译器告诉你的。