我有两个类,其中一个是另一个的子类,并且只是因为它包含一个额外的成员变量到它的父类。我没有使用默认构造函数,将对单个对象的引用作为constructors参数传递。我想要的是父项的构造函数检查此对象,然后确定是构造父类的实例(在大多数情况下)还是子类(在少数特殊情况下)。
class Superclass
{
public:
Foo foo;
Superclass(MyObject* object)
{
foo = object->GetFoo();
if(object->CreateSubclass())
{
//Create Subclass
}
else
{
//Create Superclass
}
}
};
class Subclass : public Superclass
{
public:
Barr barr;
Subclass(MyObject* object)
{
barr = object->GetBarr();
}
};
我知道工厂设计模式,但不想只为此拥有工厂对象。我宁愿将Superclass初始化内容复制到Subclass(看起来很糟糕),然后检查创建Superclass的每个点的对象,然后调用相应的构造函数:
Superclass* class;
if(object->CreateSubclass())
{
class = new Subclass(obj);
}
else
{
class = new Superclass(obj);
}
这种事情是否可行,如果是这样,我将如何从Superclass构造函数中调用子类构造函数?我试过调用Subclass(object)
,但是我遇到了需要在另一个之前定义Superclass和Subclass的问题。
感谢您提供任何建议。
答案 0 :(得分:6)
如果您是针对工厂类设置的,为什么不只是一个静态函数?
class Subclass
{
public:
static Superclass* create(const MyObject* const object)
{
if (object->createSubclass())
{
return new Subclass(object);
}
else
{
return new Baseclass(object);
}
}
// ...
}
// ...
Superclass* const myInstance = Subclass::create(myObject);
(我把静态类放在Subclass中,因为它需要超级实现和子类实现,但是你可以很容易地将它放在共享命名空间中,或者甚至把声明放在基类中但是把实现放在一个cpp)
您现在已经获得了工厂类的大部分好处,没有比以前更多的代码。你只是缺少传递它的能力或者很容易将它重构为多个实现。
答案 1 :(得分:3)
我认为这是不可能的。在调用构造函数之前分配对象。否则就没有'this'指针,你无法初始化你的变量。想一想。还要注意构造函数不返回任何内容,但新的YourClass()的输出是指向新对象的指针。