有没有办法在类声明中为基类指定默认初始值设定项?
说我有:
#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};
};
我考虑过使用委托构造函数,但是如果有多个base和不同的构造函数,其中相同的base并不总是默认初始化,那么委托构造函数将无助于简化与构造函数member initializer list相同的方式为成员做。
答案 0 :(得分:3)
有没有办法在类声明中为基类指定默认初始值设定项?
要在类声明本身中执行此操作,需要使基类具有模板参数,例如:
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
构造函数提供默认值并省略{{1}构造函数(是的,你可以在这个例子中使用委托构造函数),例如:
= default