ФлеймФорумПрограммирование

Полиморфизм указателей (на перепутье С/С++).

Страницы: 1 2 37 8 Следующая »
#0
14:09, 31 июля 2019

Малюю тут обертку над гейпиой.

Есть несколько сучностей:

struct vertex_buffer_t;
struct index_buffer_t;
struct uniform_buffer_t;
struct xform_feedback_buffer_t;
...

Весь этот зоопарк должен быть сполиморфирован с

struct gpu_buffer_t;

Дабы уметь делать так:

void destroy_gpu_buffer(gpu_buffer_t* buffer);

vertex_buffer_t* create_vertex_buffer(...);
void set_vertex_buffer(vertex_buffer_t* buffer);

index_buffer_t* create_index_buffer(...);
...
vertex_buffer_t* vbuf = create_vertex_buffer(...);
index_buffer_t* ibuf = create_index_buffer(...);
...
// Ok - index buffer is derived from gpu buffer
destroy_gpu_buffer(ibuf);
// Ok - vertex buffer is derived from gpu buffer
destroy_gpu_buffer(vbuf);
...
// Error - cannot convert index buffer to vertex buffer
void set_vertex_buffer(ibuf);

Как разрулить?

#1
14:19, 31 июля 2019

nes
>
> Как разрулить?

Ну естественно эксплисит кастингом, причем систайл.

destroy_gpu_buffer((gpu_buffer_t*)ibuf);

#2
14:23, 31 июля 2019

jaguard
Кривенько.

#3
14:26, 31 июля 2019

Можно так:

class vertex_buffer_t final : public gpu_buffer_t{}

> create
> destroy
Для этого есть конструкторы/деструкторы.

#4
14:28, 31 июля 2019

nes
> Кривенько.

Сделай  пряменько - https://www.learncpp.com/cpp-tutorial/910-overloading-typecasts/

#5
14:28, 31 июля 2019

Panzerschrek[CN]
Не хочу загоняться на счетчиках ссылок.

#6
14:52, 31 июля 2019

nes
> Не хочу загоняться на счетчиках ссылок.
Какая разница, класс у тебя или структура? ОДин хрен у тебя либо указатель, либо нет. Ты дельфист чтоли?

#7
14:59, 31 июля 2019

Кармак писал на голом си полиморфмизм в стиле как тут надо.
Но это уродливее чем на плюсах, ибо их для того и придумали.

#8
15:11, 31 июля 2019

nes
>
> Кривенько.

Ты же намеренно избегаешь С++ полиморфизма, а в си по-другому низя.

#9
15:29, 31 июля 2019

@!!ex
>Какая разница, класс у тебя или структура? ОДин хрен у тебя либо указатель, либо нет. Ты дельфист чтоли?
У меня в обоих случаях указатель.

#10
15:31, 31 июля 2019

nes
Ок. И причем тут тогда счетчик ссылок?

#11
15:39, 31 июля 2019

jaguard
> а в си по-другому низя.
Можно.
базовая структура должна быть первым полем наследников. Допустим с именем base.
Тогда &ptr->base это каст к базе.
Сам полиморфизм мутится или через указатели на методы или аналог vptr.
Но все равно код много более лапшистый чем в плюсах будет.

#12
15:41, 31 июля 2019

@!!ex
При том, что это самый просто вариант для разруливания шаринга ресурса несколькими объектами.

#13
15:41, 31 июля 2019

=A=L=X=
Не катит. Тогда destroy_gpu_buffer удалит корректно только данные относящиеся к base

#14
15:41, 31 июля 2019

nes
> При том, что это самый просто вариант для разруливания шаринга ресурса
> несколькими объектами.
А сейчас ты как разруливаешь?

Страницы: 1 2 37 8 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.