ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Класс с динамическим шаблонным полем (https://forum.antichat.xyz/showthread.php?t=1379382)

Ya Zaregalsya 18.02.2021 03:07

Часто возникает задача когда нужно создать несколько классов, у которых будут одинаковые названия методов, но разная их реализация, а потом работать с ними так, будто это один класс. Очевидным решением в такой ситуации становятся шаблоны:

C++:





[CODE]
class
A
{
public
:
int
get
(
)
{
return
0
;
}
}
;
class
B
{
public
:
int
get
(
)
{
return
1
;
}
}
;
template

class
C
{
public
:
T obj
;
void
main
(
)
{
std
::
cout



Но допустим, тип поля obj должен определяться условно и не просто во время работы программы, а уже после создания экземпляра класса C без его разрушения, кол-во возможных типов при этом может быть ограничено. Сейчас приходится нагромождать кучу костылей: сначала создавать enum ClassType с названиями всех типов, потом в классе C создавать поле для каждого типа (A objA, B obj B), а потом в каждой функции мучиться с оператором switch(ClassType) — это неудобно и выглядит отвратительно. Потребность ведь совсем ненадуманная, она может возникнуть в любой большой программе. Как в таком случае организуют код опытные разработчики?

memir 18.02.2021 14:16

Наследуйся от общего класса с виртуальным методом get() и переопределяй в дочерних. А поле делай как unique_ptr на базовый класс

Ya Zaregalsya 18.02.2021 21:27

Цитата:

Сообщение от memir

Наследуйся от общего класса с виртуальным методом get() и переопределяй в дочерних. А поле делай как unique_ptr на базовый класс

Тогда ведь будут вызываться методы get() базового класса, разве нет?

memir 18.02.2021 21:53

Цитата:

Сообщение от Ya Zaregalsya

Тогда ведь будут вызываться методы get() базового класса, разве нет?

нет, при вызове виртуального метода по ссылке или указателю срабатывает динамический полиморфизм и вызовется реализация метода для дочернего класса

Ya Zaregalsya 19.02.2021 00:30

Цитата:

Сообщение от memir

виртуальногометода

Вот оно!


Время: 03:12