c++ - 默认基类初始化器

标签 c++ constructor initialization

有没有办法在类声明中为基类指定一个默认初始化器?

假设我有:

#include <string>

struct Animal {
    Animal(int legs) : legs{legs} {}
    Animal() = default;
    int legs{4};
};

struct Ant : Animal {
    Ant(int size)       : Animal{6}, size{size} {}
    Ant()               : Animal{6} {}
    Ant(std::string s)  : Animal{6} {}
    int size{0};
};

struct Spider : Animal {
    Spider(int size)       : Animal{8}, size{size} {}
    Spider()               : Animal{8} {}
    Spider(std::string s)  : Animal{8} {}
    int size{0};
};

有没有一种方法可以指定类似于default member initializer默认基础初始化器

也许是这样的:

#include <string>

struct Animal {
    Animal(int legs) : legs{legs} {}
    Animal() = default;
    int legs{4};
};

struct Ant : Animal{6} {
    Ant(int size)       : size{size} {}
    Ant()                {}
    Ant(std::string s)   {}
    int size{0};
};

struct Spider : Animal{8} {
    Spider(int size)       : size{size} {}
    Spider()                {}
    Spider(std::string s)   {}
    int size{0};
};

我考虑过使用委托(delegate)构造函数,但如果有多个基和不同的构造函数,其中相同的基并不总是默认初始化,那么委托(delegate)构造函数将无助于以与构造函数相同的方式进行简化 member initializer list会为成员(member)做。

最佳答案

Is there a way to specify a default initializer for a base class in the class declaration?

要在类声明本身中做到这一点,需要使基类具有模板参数,例如:

template <size_t NumberOfLegs>
struct Animal {
    Animal() = default;
    int legs{NumberOfLegs};
};

struct Ant : Animal<6> {
    Ant()               = default;
    Ant(int size)       : size{size} {}
    Ant(std::string s)  {}
    int size{0};
};

struct Spider : Animal<8> {
    Spider()               = default;
    Spider(int size)       : size{size} {}
    Spider(std::string s)  {}
    int size{0};
};

但这意味着 Animal<6>Animal<8>是不同的类类型,你将无法绕过 AntSpider Animal 所在的对象预期(即不使用更多模板)。

话虽这么说,假设你真的想要 Animal要成为一个可以从中派生并传递的独特类,我建议你可以给你的 int构造函数默认值并省略 = default构造函数(是的,您可以在此示例中使用委托(delegate)构造函数),例如:

struct Animal {
    Animal(int legs = 4) : legs{legs} {}
    int legs;
};

struct Ant : Animal {
    Ant(int size = 0)   : Animal{6}, size(size) {}
    Ant(std::string s)  : Ant(0) {}
    int size;
};

struct Spider : Animal {
    Spider(int size = 0)   : Animal{8}, size{size} {}
    Spider(std::string s)  : Spider(0) {}
    int size;
};

关于c++ - 默认基类初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49779122/

相关文章:

c++ - 针对库的静态链接实际上做了什么?

c++ - sfml sf::Image() 类问题

c++ - main() 首先在这里定义

f# - 我应该使用 new Type() 还是只使用 Type() 来调用构造函数

java - 当构造函数已经应该获得 float 时请求 float

swift - 初始化类的实例时,顺序是什么?

c++ - 为什么定义静态成员变量时不遵循定义顺序?

c++ - 如何实现一个可以被换行分割的流

c++ - 构造函数和析构函数必须是虚的?

c++ - 初始化顺序