如何避免初始化程序列表中的代码重复

时间:2019-03-14 18:28:31

标签: c++ constructor

我从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")
 {}

问题:是否有任何方法可以使代码更紧凑,减少“复制粘贴”?

2 个答案:

答案 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"};
};