有没有办法在类声明中为基类指定一个默认初始化器?
假设我有:
#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>
是不同的类类型,你将无法绕过 Ant
和 Spider
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/