Создание класса с указателем на другой класс
Учу C++. Пишу свой велосипед (сугубо для учёбы) в виде рендера для командной строки Windows. Возникла дилемма, которую не знаю, как решить
Дано:
- Абстрактный класс «RenderDataObject» для наследования другими классами. У класса есть виртуальная функция «GetData()», которая обязана перегружаться потомками
- Класс «Render». Он имеет вектор, который хранит указатели на объекты класса «RenderDataObject». При вызове другой функции класс «Render» обходит вектор и вызывает у объектов «RenderDataObject» функцию «GetData()», после чего происходит отрисовка
Для связи между двумя этими класса в конструктор класса «RenderDataObject» я передаю указатель на класс «Render» и храню его. В конструкторе мы вызываем функцию «Render::AddObject(RenderDataObject* A)», чтобы добавить указатель в вектор. В деструкторе вызываем функцию «Render::RemoveObject(RenderDataObject* A)», чтобы удалить указатель из вектора
Проблема: Как корректно сделать связь между ними? Передача указателя класса «Render» в конструктор «RenderDataObject» вроде бы и неплохая идея, но для любого потомка нужно будет передавать указатель, что как-то странно выглядит. Плюс может быть куча других параметров и, как мне кажется, это очень неудобно
Думал над тем, чтобы класс «Render» имел шаблонную функцию, которая бы создавала объект и возвращала его, но тогда никак нельзя передать параметры в конструктор класса-потомка. Плюс такое даже скомпилировать не получилось, хотя может я делал что-то не так
Ещё возник вариант с глобальной переменной класса «Render» в файле .h/.cpp и абстрактный класс может ей пользоваться, но как-то это тоже очень странно выглядит
UPD: Оказывается я неправильно писал шаблонную функцию, сейчас получилось. Но возникла другая проблема: как можно передать параметры в конструктор потомка? Ведь, теоретически, эту функцию может использовать любой потомок класса «RenderDataObject»
class RenderDataObject
{
const char* abstractData = "Data abstract class";
public:
RenderDataObject()
{
}
virtual const char* GetData() = 0;
};
class myObject : public RenderDataObject
{
private:
const char* objectData = "Data my object";
public:
myObject(const char* data)
{
objectData = data;
}
const char* GetData()
{
return "Hello, world!";
}
};
std::vector<RenderDataObject*> vector;
template <class T>
T* Create()
{
T* value = new T;
vector.push_back(value);
return a;
}
int main()
{
myObject* obj = Create<myObject>();
system("pause");
}