成员列表初始化与继承?

时间:2021-04-01 18:32:18

标签: c++ oop inheritance constructor

我想为 C 类构建一个构造函数,正如你在最后一行看到的那样。我不明白为什么它不起作用。如果我删除 :B(b, A bb):b(b), bb(bb) 就好了,但是我不能给出 b 和 bb 的值。另外,我不确定如何在主函数中创建一个包含所有参数的对象。

class A
{
protected:
   int a, aa;
public:
   A();
   A(int a, int aa);
   ~A();
   friend class B;
   friend class C;
};
class B
{
protected:
   int b;
   A bb;
public:
   B();
   B(int b, A bb);
   ~B();
};
class C: class B
{
private:
   int c;
   A cc;
public:
   C();
   C(int c, A cc);
   ~C();
  };

C:C(int c, A cc):c(c), cc(cc):B(b, A bb):b(b), bb(bb){}  // I tried smth like this, but obviously it doesn't work

int main()

{ A aaa(1, 2);
C(3, A); ///how can i set values for B-members

2 个答案:

答案 0 :(得分:1)

首先,C从B的继承被破坏了,它需要class C: B,而不是class C: class B。因此,您甚至在到达初始化列表之前就遇到了编译器错误。您不能指望我们修复您的代码,而这些代码不是您的问题的一部分...

但重点是:请记住,当您构造 B 类的子类 C 的实例时,您应该首先构造 B 实例。这也适用于初始化列表。所以构造函数必须是这样的:

C::C(/* whatever */) : B(/* whatever */), /* construction of direct members of C */ { }

现在,对于您的特定列表,正如@ChrisMM 所建议的,应该是:

C::C(int c_, A cc_) : B(c_, A cc_), c(c_), cc(cc_) { }

这些是我对您的线路所做的更改:

  1. 为了定义构造函数,我将其称为 C::C(/whatever/),并带有 两个 冒号标记。这是一个不同于单个冒号的符号 - 完全不同的含义!
  2. 先构造 B。
  3. 没有“嵌套初始化列表”这样的东西,因此您只能使用 : 一次。
  4. 我使构造函数参数名称与字段名称不同,因为当您选择相同的名称时,它会非常混乱。此外,使用与类名称相似但大小写不同的字段名称也是一个坏主意。我知道你在这个例子中使用了这些名字,但是,这给其他人树立了一个坏榜样。

答案 1 :(得分:0)

您应该做的第一件事是将成员变量重命名为与构造函数参数名称不同的名称;否则,您将很难从参数中消除成员变量的歧义。

例如,在下面的代码(编译)中,我将所有成员变量重命名为具有 m_ 前缀,以使读者清楚它们是成员变量而不是其他变量。

另请注意,由 B 类的构造函数设置 B 对象的成员变量,因此 C 类构造函数调用适当的 {{1} } 类构造函数来做到这一点,而不是试图直接设置 B 的成员变量。

B
相关问题