2010-07-16 67 views
1

我有两个类,其中一个是另一个的子类,不同之处仅在于它包含父级的附加成员变量。我没有使用默认的构造函数,将对单个对象的引用作为构造函数参数传入。我想让父对象的构造函数检查这个对象,然后确定是构造一个父类(大多数情况下)还是子类(在一些特殊情况下)的实例。C++ - 产生子类的实例的超类构造函数

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* class; 
if(object->CreateSubclass()) 
{ 
    class = new Subclass(obj); 
} 
else 
{ 
    class = new Superclass(obj); 
} 

这算哪门子的可能的事情,如果是的话,我将如何去从超类构造函数调用子类的构造函数?我试过打电话给Subclass(object),但遇到需要在另一个之前定义的超类和子类的问题。

感谢您提供任何建议。

+4

为什么你不想要一个工厂功能?这是他们使用的确切位置。 – Rudi 2010-07-16 11:25:07

+0

我想要使用它的地方对于一个工厂来说几乎看起来太琐碎了,再加上我正在处理的插件需要额外的膨胀和维护,以增加每个新类(不是我的!)。也许工厂是要走的路,但它大约需要5行,而且从可维护性的角度来看,我通常会担心会有太多的小琐碎类。很显然,班级太少了,如果不是更糟糕的话,但是一个五线班的班主任感觉不好。 – Edd 2010-07-16 12:17:19

+1

他说的是使用静态工厂方法,而不是抽象工厂类。 – gtrak 2010-07-17 02:26:07

回答

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

(我已经把静态类的子类,因为它需要两个超和子类实现,但你可以很容易地把它放在一个共享命名空间或东西,甚至把声明的基类,但把实现放在cpp中)

现在你已经获得了工厂类的大部分好处,没有比以前更多的代码。您只是错过了将它传递或者轻松将其重构为多个实现的能力。

+0

这看起来不错。当我回到那个项目时,我会稍微玩一下。 – Edd 2010-07-16 12:12:00

+0

这是这类事情的标准解决方案。 – gtrak 2010-07-16 13:09:59

+0

如果你喜欢它,你可以接受它作为答案;) – tenpn 2010-07-18 14:13:48

3

我认为这是不可能的。该对象在构造函数被调用之前分配。否则就不会有'this'指针,你不能初始化你的变量。想想看。另请注意,构造函数不返回任何东西,但新的YourClass()的输出是指向新对象的指针。

+1

更具体:对象将占用的空间将在构造函数调用之前保留。 – Frunsi 2010-07-16 11:34:44

+0

是的,现场参考只是偏移到这个空间,是正确的? – gtrak 2010-07-16 11:47:04

+0

这很有道理。我不一定声称它应该工作,只是说明我想做什么,或者可以提出解决方案或替代方案。 – Edd 2010-07-16 12:11:11