繁体   English   中英

如何使用运行时选择base-ctor初始化不可复制的基类

[英]how to init noncopyable base class with runtime-choosing base-ctor

我可以销毁基类并用此技巧在派生类中重新创建它吗?

class base: noncopyable
{
    base();         //ctor with none param
    base(int x);    //ctor with one param
    base(int x, int y); //ctor with two param

    virtual ~base();
}

struct params
{
    int x;
    int y;
    enum 
    {
        typeNoneParam,  //neither x nor y is defined
        typeOneParam,   //only x is defined
        typeTwoParam    //x and y both are defined
    }typeParam;
}

class Derived
{
    Derived(params p);  //construct base class conditionally by p.typeParam
}

Derived::Derived(params p)
    :base() //default typeNoneParam
{
    //typeNoneParam need not do special process

    if (p.typeParam == params::typeOneParam)
    {
        base::~base();  //delete the default-typeNoneParam creation by base-dtor
        base(p.x);      //recreate the new base with one-param base-ctor
    }
    if (p.typeParam == params::typeOneParam)
    {
        base::~base();  //delete the default-typeNoneParam creation by base-dtor
        base(p.x, p.y); //recreate the new base with two-param base-ctor
    }
}

类派生类和基类的所有声明都不能更改,结构参数也不能更改。

仅派生类的实现是允许更改的。

任何人都可以提出实现的想法吗? 还有其他更温和的实现可以很好地满足这种情况(使用动态选择base-ctor初始化不可复制的基类)吗?

在这种情况下,我将向您的派生类添加静态工厂函数(可选地使您的构造函数受到保护)。 您可以在其中将typeParam上的开关typeParam在那里,并使用正确的构造函数创建对象。 您将需要在派生类中具有三个构造函数,每个枚举条目一个。

这将给出正确的行为而不会引起黑客攻击。

派生类构造函数取决于首先构造的有效基类对象。 通过销毁基类,我几乎可以肯定,您正在调情未定义行为。 例如,您可能会看到这体现在虚函数上。

正确的方法是让Derived类将参数作为初始化列表的一部分传递给Base类构造函数:

Derived(params p) : base(p) {};

暂无
暂无

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

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