Size: a a a

2021 February 16

I

Ioann_V in supapro.cxx
Вопрос то понятен?
источник

DP

Denis Paukaev in supapro.cxx
пока не понятен, там хранить это где
источник

I

Ioann_V in supapro.cxx
Denis Paukaev
пока не понятен, там хранить это где
внутри render_shape
источник

D

Danya in supapro.cxx
Ioann_V
class shape
{
   
};

class circle : public shape
{
};

class rect : public shape
{
};

class render_base
{
};

class render_shape : public render_base
{
// Вот тут я могу внутри композиторовать или агрегировать любую фигуру или могу сделать наследование для каждой фигуры от этого класса, в нем я храню скажем вот что(помимо самой фигуры, если композируемся - агрегируемся):

  shape_color;
};

Собственно в классе выше, композиция или наследование? Если композиция, то я там могу хранить любой shape, но что делать, если мне нужно в дальнейшем иметь класс, который всегда хранит данные круга? Я могу туда в класс передать круг, да, но тогда затем, при работ с этим классом, делать static_cast моего shape. Все верно или что не так?
Наверное тебе надо просто сделать рендерер для каждой фигуры и создавать эти рендеры через фабрику
источник

AF

Aidar Fattakhov in supapro.cxx
Ioann_V
class shape
{
   
};

class circle : public shape
{
};

class rect : public shape
{
};

class render_base
{
};

class render_shape : public render_base
{
// Вот тут я могу внутри композиторовать или агрегировать любую фигуру или могу сделать наследование для каждой фигуры от этого класса, в нем я храню скажем вот что(помимо самой фигуры, если композируемся - агрегируемся):

  shape_color;
};

Собственно в классе выше, композиция или наследование? Если композиция, то я там могу хранить любой shape, но что делать, если мне нужно в дальнейшем иметь класс, который всегда хранит данные круга? Я могу туда в класс передать круг, да, но тогда затем, при работ с этим классом, делать static_cast моего shape. Все верно или что не так?
Тут шаблон
источник

AF

Aidar Fattakhov in supapro.cxx
render<shape>
источник

SH

Serhii Herashchenko in supapro.cxx
Ioann_V
class shape
{
   
};

class circle : public shape
{
};

class rect : public shape
{
};

class render_base
{
};

class render_shape : public render_base
{
// Вот тут я могу внутри композиторовать или агрегировать любую фигуру или могу сделать наследование для каждой фигуры от этого класса, в нем я храню скажем вот что(помимо самой фигуры, если композируемся - агрегируемся):

  shape_color;
};

Собственно в классе выше, композиция или наследование? Если композиция, то я там могу хранить любой shape, но что делать, если мне нужно в дальнейшем иметь класс, который всегда хранит данные круга? Я могу туда в класс передать круг, да, но тогда затем, при работ с этим классом, делать static_cast моего shape. Все верно или что не так?
делай через диспатч
источник

I

Ioann_V in supapro.cxx
Aidar Fattakhov
render<shape>
Это хорошая идея, у меня она тоже есть в закромах. Тут проблема будет в том, что тогда, я теряю возможность хранить и менять и то и другое - то есть, сменить затем, круг на прямоугльник
источник

AF

Aidar Fattakhov in supapro.cxx
Ioann_V
Это хорошая идея, у меня она тоже есть в закромах. Тут проблема будет в том, что тогда, я теряю возможность хранить и менять и то и другое - то есть, сменить затем, круг на прямоугльник
Для этого должен быть renderer<void>
источник

AF

Aidar Fattakhov in supapro.cxx
Ну или вон base
источник

AF

Aidar Fattakhov in supapro.cxx
Иначе зачем он тебе
источник

SH

Serhii Herashchenko in supapro.cxx
class render_shape;

class shape
{
public:
   virtual ~shape();
   virtual void render(render_shape* render) = 0;
}

class circle : public shape
{
   ...
   void render(render_shape* render) override
   {
       render->render_circle(*this); // or any other way to draw circle
   }
}
источник

AF

Aidar Fattakhov in supapro.cxx
Aidar Fattakhov
Для этого должен быть renderer<void>
Главное помнить что срезая тип ты теряешь данные
источник

I

Ioann_V in supapro.cxx
Serhii Herashchenko
class render_shape;

class shape
{
public:
   virtual ~shape();
   virtual void render(render_shape* render) = 0;
}

class circle : public shape
{
   ...
   void render(render_shape* render) override
   {
       render->render_circle(*this); // or any other way to draw circle
   }
}
Ну вот это как раз решение, с наследованием для каждой фигуры
источник

AF

Aidar Fattakhov in supapro.cxx
Которые потом не восстановить
источник

SH

Serhii Herashchenko in supapro.cxx
Serhii Herashchenko
class render_shape;

class shape
{
public:
   virtual ~shape();
   virtual void render(render_shape* render) = 0;
}

class circle : public shape
{
   ...
   void render(render_shape* render) override
   {
       render->render_circle(*this); // or any other way to draw circle
   }
}
а потом

class render_shape : public render_base
{
   ...
   void render(shape& shape)
   {
       shape.render(this);
   }
}
источник

I

Ioann_V in supapro.cxx
Ну это посетитель, классический.
источник

SH

Serhii Herashchenko in supapro.cxx
Ioann_V
Ну это посетитель, классический.
нет, это dispatch, он похож на посетителя, но смысл немного другой
источник

SH

Serhii Herashchenko in supapro.cxx
в некоторых языках так полиморфизм сделан
источник

SH

Serhii Herashchenko in supapro.cxx
Ioann_V
Ну вот это как раз решение, с наследованием для каждой фигуры
не обязательно
источник