构造函数可以更改默认成员类型吗?

时间:2018-06-25 13:22:12

标签: c++

我正在与成员A一起编写m类。
我希望成员变量具有默认的(派生的)类型,但可以选择在类构造函数中将其更改为另一种(派生的)类型。 像

// A.h
class A
{
    DefaultType m {0};
};


// A.cpp
A::A()
{
    // if this is present, change m
    m = OtherType(1., 2.);

    // otherwise, leave as default
}

对不起,我第一次不清楚,试图简化问题,可能使它难以理解。
上下文是我将A的构造函数暴露给用户,该用户应该编写该构造​​函数,编译代码并运行它。 A的其余实现位于单独的文件中,用户不可访问。在那里定义的A的某些成员函数将需要访问m.fun(),这是DefaultTypeOtherType的常用方法。

所以约束是我希望构造函数中的语法尽可能简单。 如果用户编写了构造函数,而只是忽略了m的(重新)定义,则程序将只认为它是默认类型,并使用该类中的.fun()。否则,m将是OtherType.fun()将从那里来。

此外,还有大约10个其他成员,例如m
我想知道这样的事情是否可行,还是我不得不重新考虑整个设计。

1 个答案:

答案 0 :(得分:0)

您可以这样做:

class Base
{
    virtual ~Base() {}
};

class DefaultType : public Base
{
};

class OtherType : public Base
{
};

class A
{
public:
    A(bool use_default = true)
    {
        if (use_default)
            m.reset(new DefaultType());
        else
            m.reset(new OtherType());
    }
    std::unique_ptr<Base> m;
};