C++ C++;-产生子类实例的超类构造函数

C++ C++;-产生子类实例的超类构造函数,c++,inheritance,constructor,C++,Inheritance,Constructor,我有两个类,其中一个是另一个的子类,不同之处在于它包含一个附加到其父类的成员变量。我没有使用默认构造函数,而是将对单个对象的引用作为构造函数参数传递。我希望父类的构造函数检查这个对象,然后确定是构造父类的实例(在大多数情况下)还是子类的实例(在少数特殊情况下) 我知道factory设计模式,但我不想为了这个就必须有一个factory对象。我宁愿将超类初始化的内容复制到子类中(这看起来很糟糕),然后在创建超类的每个点检查对象,然后调用相应的构造函数: Superclass* class; if(o

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

我知道factory设计模式,但我不想为了这个就必须有一个factory对象。我宁愿将超类初始化的内容复制到子类中(这看起来很糟糕),然后在创建超类的每个点检查对象,然后调用相应的构造函数:

Superclass* class;
if(object->CreateSubclass())
{
    class = new Subclass(obj);
}
else
{
    class = new Superclass(obj);
}
这类事情可能发生吗?如果可能,我将如何从超类构造函数调用子类构造函数?我尝试调用
子类(对象)
,但遇到了超类和子类都需要先定义的问题


谢谢你提供的任何建议。

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

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

如果设置为工厂类,为什么不只是一个静态函数

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


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

如果您设置为使用工厂类,为什么不使用静态函数

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



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

为什么不需要工厂功能?这正是它们被使用的地方。在我想要使用的地方,对于一个工厂来说,它似乎太微不足道了,再加上我正在使用的插件需要为每个新添加的类增加额外的膨胀和维护(不是我做的!)。也许一个工厂是最好的选择,但它大约有5行长,从可维护性的角度来看,我通常会担心有太多的小类。显然,太少的类也同样糟糕,如果不是更糟的话,但是一个5行的类感觉是个坏主意。他说的是使用静态工厂方法,而不是抽象工厂类。对不起,我真的应该学习阅读!这是漫长的一周中的星期五!你为什么不想要一个工厂函数?这正是它们被使用的地方。在我想要使用的地方,对于一个工厂来说,它似乎太微不足道了,再加上我正在使用的插件需要为每个新添加的类增加额外的膨胀和维护(不是我做的!)。也许一个工厂是最好的选择,但它大约有5行长,从可维护性的角度来看,我通常会担心有太多的小类。显然,太少的类也同样糟糕,如果不是更糟的话,但是一个5行的类感觉是个坏主意。他说的是使用静态工厂方法,而不是抽象工厂类。对不起,我真的应该学习阅读!这是漫长的一周中的星期五!更具体地说:对象将占用的空间将在构造函数调用之前保留。是的,字段引用只是偏移到此空间,对吗?这很有意义。我并不是说它应该工作,只是在某种程度上说明了我想要做什么,或者可以建议一个解决方案或替代方案。更具体地说:对象将占用的空间将在构造函数调用之前保留。是的,字段引用只是偏移到这个空间中,对吗?这是有意义的。我并不是说它一定会起作用,只是说我想做什么,或者可以提出一个解决方案或替代方案。这看起来不错。当我回到那个项目时,我将有一个小游戏。这是这类事情的标准解决方案。我已经做了——我只需要等到我回到工作中,先检查一些事情。无论如何,你必须等待两天才能接受答案。这看起来不错。当我回到那个项目时,我将有一个小游戏。这是这类事情的标准解决方案。我已经做了——我只需要等到我回到工作中,先检查一些事情。无论如何,您必须等待2天才能接受答复。