Создание экземпляров производных объектов из базового класса - PullRequest
5 голосов
/ 16 апреля 2011

Попытка создать класс типа Driver, где ниже Base - это драйвер, которому передается тип при создании экземпляра. Тип, в данном случае 2, используется для создания правильного производного объекта.

Мой компилятор выдает синтаксическую ошибку объявлений в строке "Class Base".

Моя конечная цель - сделать это:

Base *B;

    B = new Base(2);
    if(B)
    {
      B->DoStuff();
      B->DoMoreStuff();
      delete B;
    }

Вот мой код, который не будет компилироваться ...

class Base
{
public:

    Base(int h);
    virtual ~Base();

private:
    int hType;
    Base *hHandle;
};


class Derived1 : public Base
{
public:
    Derived1();
    virtual ~Derived1();

};

class Derived2 : public Base
{
public:
    Derived2();
    virtual ~Derived2();

};

Base::Base(int h)
{
    hType = h;

    switch(h)
    {
        case 1:
            hHandle = new Derived1;
        break;

        case 2:
            hHandle = new Derived2;
        break;

    }
}


Derived1::Derived1():Base(1)
{
    printf("\nDerived1 Initialized\n\n");
}

Derived2::Derived2():Base(2)
{
    printf("\nDerived2 Initialized\n\n");
}

Ниже приведен обновленный код для отображения полного исходного кода. Я думаю, что теперь я понимаю, почему он не будет компилироваться. Как указано ниже, у меня есть бесконечный цикл звонков на «новый»

#include <stdio.h>

class Base
{
public:

    Base();
    Base(int h);
    Create (int h);
    virtual ~Base();

private:
    int hType;
    Base *hHandle;
};


class Derived1 : public Base
{
public:
    Derived1();
    virtual ~Derived1();

};

class Derived2 : public Base
{
public:
    Derived2();
    virtual ~Derived2();

};

Base::Base()
{

}

Base::Base(int h)
{
    Create(h);
}

Base::Create(int h)
{
    hType = h;

    switch(h)
    {
        case 1:
            hHandle = new Derived1;
        break;

        case 2:
            hHandle = new Derived2;
        break;

    }
}

Derived1::Derived1()
{
    printf("\nDerived1 Initialized\n\n");
}

Derived2::Derived2()
{
    printf("\nDerived2 Initialized\n\n");
}

1 Ответ

2 голосов
/ 16 апреля 2011

Похоже, вы пытаетесь создать фабрику классов .

Я бы порекомендовал использовать статический метод в Base, который возвращает либо Derived1, либо Derived2.

class Base
{
public:
    static Base* Create(int);
    virtual void DoStuff() = 0;
}

class Derived1 : public Base
{
    Derived1()
    {
        printf("\nDerived1 Initialized\n\n");
    }

    virtual void DoStuff()
    {
    }   
}

class Derived2 : public Base
{
    Derived2()
    {
        printf("\nDerived2 Initialized\n\n");
    }

    virtual void DoStuff()
    {
    }   
}

Base* Base::Create(int n)
{
    if (n==1)
        return new Derived1();
    else if (n==2)
        return new Derived2();
    else
        return nullptr;
}

void main()
{
    Base* B = Base::Create(2);
    if(B)
    {
        B->DoStuff();
        delete B;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...