繁体   English   中英

默认基类初始化器

[英]Default base class initializer

有没有一种方法可以在类声明中为基类指定默认的初始化程序?

说我有:

#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};
};

有没有办法指定类似于默认成员初始化程序默认基本初始化 程序

大概是这样的:

#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};
};

我考虑过使用委派构造函数,但是如果存在多个基础和不同的构造函数,而其中的基础并非总是默认初始化,那么委派构造函数将无济于事,就像构造函数成员初始化程序列表对成员的简化一样。

有没有一种方法可以在类声明中为基类指定默认的初始化程序?

为此,需要在类声明本身中使基类具有模板参数,例如:

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>是不同的类类型,并且您将无法在需要Animal地方传递AntSpider对象(即,不使用更多模板)。

话虽这么说,假设您实际上希望Animal是一个可以从中派生并传递的独特类,我建议您可以为int构造函数提供默认值,并省略= default构造函数(是的,您可以在此示例中使用委托构造函数),例如:

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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM