C ++ - конструктор суперкласса, создающий экземпляр подкласса - PullRequest
1 голос
/ 16 июля 2010

У меня есть два класса, один из которых является подклассом другого, и отличается только тем, что он содержит дополнительную переменную-член для своего родителя.Я не использую конструктор по умолчанию, передавая ссылку на один объект в качестве параметра конструкторов.Я хотел бы, чтобы конструктор родительского объекта исследовал этот объект, а затем определил, следует ли создавать экземпляр родительского класса (в большинстве случаев) или подкласса (в нескольких специализированных случаях).

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

Я знаю шаблон проектирования фабрики, но не хочу иметь фабричный объект только для этого.Я предпочел бы дублировать материал инициализации Суперкласса в Подкласс (который кажется плохим), а затем исследовать объект в каждой из точек, где создается Суперкласс, и затем вызывать соответствующий конструктор:Подобные вещи возможны, и если да, то как мне будет вызывать конструктор подклассов из конструктора суперкласса?Я попытался позвонить Subclass(object), но у меня возникли проблемы с суперклассом и подклассом, которые необходимо определить раньше другого.

Спасибо за любой совет, который вы можете дать.

Ответы [ 2 ]

6 голосов
/ 16 июля 2010

Если вы настроены против заводского класса, почему бы не просто статическая функция?

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

(Я поместил статический класс в Подкласс, потому что он требует реализации как супер, так и подкласса, но вы можете легко поместить его в общее пространство имен или что-то подобное, или даже поместить объявление в базовый класс, но поместить реализацию в a cpp)

Теперь у вас есть большинство преимуществ фабричного класса, и кода у вас больше, чем было раньше. Вам просто не хватает возможности обойти его или легко перестроить в несколько реализаций.

3 голосов
/ 16 июля 2010

Я думаю, что это невозможно.Объект размещается до вызова конструктора.В противном случае не было бы указателя this, и вы не смогли бы инициализировать свои переменные.Думаю об этом.Также обратите внимание, что конструкторы ничего не возвращают, но вывод new YourClass () является указателем на ваш новый объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...