我从D
继承了类B
:
struct D: public B {
D(int b1, int p);
D(int b1, int b2, int p);
int p1;
float p2;
double p3;
std::string p4;
};
构造函数的代码与基本类的引用相同:
D::D(int b1, int p): B(b1)
, p1(p)
, p2(SomeFunc())
, p3(SomeOtherFunc() - 42)
, p4("abc")
{}
D::D(int b1, int b2, int p): B(b1, b2)
, p1(p)
, p2(SomeFunc())
, p3(SomeOtherFunc() - 42)
, p4("abc")
{}
问题:是否有任何方法可以使代码更紧凑,减少“复制粘贴”?
答案 0 :(得分:5)
使用委托的构造函数。
// Assuming default value of b2 is 0.
D::D(int b1, int p): D(b1, 0, p) {}
D::D(int b1, int b2, int p): B(b1, b2)
, p1(p)
, p2(SomeFunc())
, p3(SomeOtherFunc() - 42)
, p4("abc")
{}
有关委托构造函数的其他信息,请参见http://www.stroustrup.com/C++11FAQ.html#delegating-ctor。
答案 1 :(得分:3)
您可以在类成员初始化器中使用以指定类成员的默认值。
mem_drv = gdal.GetDriverByName('MEM')
target = mem_drv.Create('', source_raster.RasterXSize, source_raster.RasterYSize, 1, gdal.GDT_UInt16)
可以更改为
struct D: public B {
D(int b1, int p);
D(int b1, int b2, int p);
int p1;
float p2;
double p3;
std::string p4;
};
然后,如果您具有默认值,就不必在成员初始化列表中列出这些成员。这使构造函数看起来像
struct D: public B {
D(int b1, int p);
D(int b1, int b2, int p);
int p1;
float p2{SomeFunc()};
double p3{SomeOtherFunc() - 42};
std::string p4{"abc"};
};