Fer*_*eak 5 c++ constructor derived-class
我有以下场景:
根据Derived类的构造函数的输入值,我需要调用不同的Base类构造函数.
如:
struct Base
{
Base() : v(0) {}
Base(int _v) : v(_v) {}
int v;
};
struct Derived
{
Derived(int v) /* if v == 42 call Base() else call Base(int) */ {}
};
int main()
{
Derived f2(42);
Derived f1(1);
}
Run Code Online (Sandbox Code Playgroud)
根据我目前对C++的了解,我认为这是不可能的,所以我问社区他们是否知道任何黑客或脏代码会使这个可行.请不要让简单int的误导你,现实生活场景要复杂得多.随意混合使用C++ 11 magic.
编辑:另外,我不想使用"init"函数,它根据参数的值初始化不同的东西.
这确实是一个非常奇怪的请求,也许你应该重新考虑一般方法.这个特定42值的含义是什么?问题是42是什么问题?也许你应该有两个兄弟DerivedS,或子类Derived的x==42情况下或x!=42情况,等等.或者也许42来自不同类型的对象,你可以使用一个单独的构造该类型?
但是如果你确实想要完成你所要求的,一种可能的方法是在两个不同的构造函数Derived和一个"命名构造函数"(静态函数)之间进行路由.类似的东西(没有检查可兼容性,但想法应该是明确的):
struct Derived {
private:
Derived(int x): Base(x) {}
Derived(): Base() {}
public:
static Derived ConstructDerived(int x) {
if (x==42) return Derived();
else return Derived(x);
}
};
// usage
Derived a = Derived::ConstructDerived(42);
Derived b = Derived::ConstructDerived(43);
Run Code Online (Sandbox Code Playgroud)
为此,您还需要复制构造函数,但您也可以返回指针等.
另一种方法,如果42的值在编译时是固定的,则使用模板并将构造函数甚至类专门化为特定值42.
我认为应该工作的另一种方法,要求基类可以复制或移动构造:
struct Derived {
Derived(int x): Base( (x == 42)? Base() : Base(x) ) {}
};
Run Code Online (Sandbox Code Playgroud)