Мне нужно организовать свои классы так, чтобы конструктор можно было вызывать из цикла

0

Это будет трудно объяснить, поэтому позвольте мне привести пример:

Представьте, что у вас есть 10 элементов графического интерфейса, которые наследуют членов из одного абстрактного базового класса. Вы хотите иметь возможность использовать цикл, чтобы проверить, щелкнул ли пользователь какой-либо элемент. Затем вы хотите иметь возможность вызвать конструктор из этого элемента. Суть этого в том, что указатели указывают на объекты, но я спрашиваю, возможно ли, чтобы они указывали на фактический класс или делали что-то с аналогичной функцией. Видя, как это объяснение может показаться немного запутанным, позвольте мне уточнить код.

В этом примере для простоты будет использоваться 3 элемента, а не 10

class A //the base class
{
public:
    int x,y;// inherited values
    virtual void render() = 0;// thats right its an abstract class
};
A * basePointer = NULL;


class a0: public A
{
public:
    a0()
    {
        //do stuff
    }
    void render()
    {
        //do render stuff
    }
}

class a1: public A
{
public:
    a1()
    {
        //do different stuff
    }
    void render()
    {
        //do different render stuff
    }
}

class a2: public A
{
public:
    a2()
    {
        //do even more stuff
    }
    void render()
    {
        //do even more render stuff
    }
}



mainloop()
{
    //handle events and get mouse position
    for(int i = 0;i < 3;i++)//3 being the number of non-absract classes
    {
        if(a[i].x = mousePos.x && a[i].y = mousePos.y)
        {
            basePointer = new a[i]
        }
    }
}

Я понимаю, что попытка ссылаться на a1, a2 и a3 с помощью [i], а цикл был глупым, но я надеюсь, что это поможет вам понять, что я пытаюсь сделать. Любую помощь помогает или ободряют предложения.

  • 0
    Неясно, чего вы пытаетесь достичь.
  • 0
    @Alf Извините, я сделал все возможное, чтобы прояснить ситуацию
Теги:
class
polymorphism

1 ответ

1
Лучший ответ

Типичный способ достижения этого - это " клонирование " или другая форма шаблона Factory.

В базовом классе можно добавить чистый виртуальный метод Clone, позволяющий каждому объекту клонировать себя.

class A //the base class
{
public:
    int x,y;// inherited values
    virtual void render() = 0;// thats right its an abstract class
    virtual std::unique_ptr<A> Clone() = 0;
};

Типичное переопределение довольно просто:

//In class a1
virtual std::unique_ptr<A> Clone()
{
    auto clone = new a1();
    clone->x = x;
    clone->y = y;
    return std::unique_ptr<A>(clone);
}

Написание цикла for для рендеринга и дублирования объектов тогда тривиально:

std::vector<A*> items;
items.push_back(new a0 ());
items.push_back(new a1 ());
items.push_back(new a2 ());

for(auto item : items)
{
    item->render();
    auto new_item = item->Clone();
    // use the clone
}

Живой пример на идеоне.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню