我有这个:
class foo {
public:
int a;
int b;
int c;
};
哪个好,但是我想在不修改类foo的情况下添加一些运算符重载:
class bar: public foo {
operator==(const bar &x) const {
return a == x.a;
}
}
到目前为止很好,但是现在我需要使用从另一个类获得的对象数组来初始化bar。没问题,我可以在专用的构造函数中将所有foo变量复制到bar:
bar::bar(foo &x) {
a = foo.a;
/* etc */
}
但是这看起来很混乱,如果类foo结束了,那么我也必须更新吧。如果bar可以自动初始化(它永远不会包含自己的数据成员),那就更好了。
答案 0 :(得分:2)
并不像确保Foo有复制构造函数那么简单.......
bar::bar(foo &x)
: foo(x)
{
}
class foo {
foo::foo(foo &x)
{
a = foo.a; /* etc */
}
};
答案 1 :(得分:1)
嗯,轻松:
bar::bar(const foo& x)
: foo(x)
{
}
只需使用foo
的复制构造函数。 :
和{
之间的所有内容都称为初始化列表。您可以直接在其中初始化您的成员和基类。对于foo
,复制构造函数可能如下所示:
foo::foo(const foo& other)
: a(other.a)
, b(other.b)
, c(other.c)
{
}
请注意,我通过const引用获取两个参数,这是一个很好的做法,因为您没有触及其他对象。另请注意,只有当您的类包含原始指针(例如foo
)时,大多数情况下都不需要自己编写int*
的复制构造函数。如果你没有定义一个拷贝,并且只是为所有数据成员做一个浅拷贝,编译器就会生成一个拷贝ctor。
答案 2 :(得分:0)
继承构造函数不能在C ++ 03中完成,但可以近似。添加这些构造函数:
template<class T1> bar(const T1& x1) : foo(x1) {}
template<class T1, class T2> bar(const T1& x1, const T2& x2) : foo(x1, x2) {}
template<class T1, class T2, class T3> bar(const T1& x1, const T2& x2, const T3& x3) : foo(x1, x2, x3) {}
// as much as you need...
在C ++ 0x中使用单个可变参数模板化构造函数并完美转发。