我想为 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
答案 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 :(得分:0)
您应该做的第一件事是将成员变量重命名为与构造函数参数名称不同的名称;否则,您将很难从参数中消除成员变量的歧义。
例如,在下面的代码(编译)中,我将所有成员变量重命名为具有 m_
前缀,以使读者清楚它们是成员变量而不是其他变量。
另请注意,由 B
类的构造函数设置 B
对象的成员变量,因此 C
类构造函数调用适当的 {{1} } 类构造函数来做到这一点,而不是试图直接设置 B
的成员变量。
B