【问题标题】:C++ - Superclass constructor producing an instance of a subclassC++ - 产生子类实例的超类构造函数
【发布时间】:2010-07-16 11:22:26
【问题描述】:

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

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),但遇到了需要先定义超类和子类的问题。

感谢您提供的任何建议。

【问题讨论】:

  • 为什么不想要一个工厂函数?这是使用它们的确切位置。
  • 我想在哪里使用它对于工厂来说似乎太微不足道了,再加上我正在开发的插件需要为每个添加的新类进行额外的膨胀和维护(不是我做的) !)。也许工厂是要走的路,但它大约有 5 行长,从可维护性的角度来看,我通常会担心有太多的琐碎小类。显然,课程太少也同样糟糕,如果不是更糟的话,但 5 行课程感觉是个坏主意。
  • 他是说使用静态工厂方法,而不是抽象工厂类。
  • 对不起-我真的应该学会阅读!这是漫长一周中的星期五!

标签: c++ inheritance constructor


【解决方案1】:

如果您针对的是工厂类,为什么不只使用静态函数?

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)

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

【讨论】:

  • 这看起来不错。当我回到那个项目时,我会玩一点。
  • 这是这类事情的标准解决方案。
  • 我已经完成了 - 我只需要等到我回来工作并先检查一些事情。无论如何,您必须等待 2 天才能接受答案。
【解决方案2】:

我认为这是不可能的。在调用构造函数之前分配对象。否则将没有“this”指针,您无法初始化变量。想想看。另请注意,构造函数不返回任何内容,但 new YourClass() 的输出是指向新对象的指针。

【讨论】:

  • 更具体地说:对象将占用的空间,将在构造函数调用之前保留。
  • 是的,字段引用只是该空间的偏移量,对吗?
  • 这是有道理的。我不一定声称它应该有效,只是说明我想做什么,因此可以提出解决方案或替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多