LINUX.ORG.RU

Оператор new возвращает указатели на экземпляры разных классов в зависимости от параметров конструктора. Возможно ли?

 , , operator,


0

1

Пишу сейчас некий класс, в конструктор которого передаётся строковый параметр «тип устройства» (мотор, светодиод, уж, ёж), и в зависимости от типа устройства экземпляр класса должен себя по-разному вести. Можно ли так написать, чтобы при вызове конструктора

new Instance("LED")
я получал указатель на экземпляр класса Leds наследующего от Instance? Не хочется создавать protected переменную, в которой будет хранится переданный тип устройства, и в зависимости от её значения действовать по-разному.

Правильно я понимаю, что мне нужно перегрузить operator new? Можно увидеть пример кода?

★★★★★
Ответ на: комментарий от tailgunner

Ты показал, что можешь писать код с фатальными ошибками

для дебилов - это пример, там еще виртуального деструктора нет, например, т.к. опять же для примера он не нужен, а для рабочего кода - еще как

wota ★★
()
Ответ на: комментарий от Gorthauer

Вот интересно а что случится если создать этот обьект на стеке?

если убрать realloc и добавить new - похерит стек

wota ★★
()
Ответ на: комментарий от wota

Ты показал, что можешь писать код с фатальными ошибками

для дебилов - это пример

Ну ты не злись так. Облажался, бывает.

tailgunner ★★★★★
()
Ответ на: комментарий от dmfd

Нужно ли возвращать здесь smart pointer или raw pointer - вопрос спорный. Я бы возвращал именно raw pointer, а юзер пусть оборачивает его как хочет.

Я бы возвращал unique_ptr. Он без лишних слов превращается в shared_ptr. Другие варианты от лукавого, но если юзеру шибко надо будет, получится в худшем случае

hell_ptr<Device> p(makeDevice(q).release());

const86 ★★★★★
()
Ответ на: комментарий от wota

ты там показал, что умеешь писать быдлокод без проверок по твоей логике

(пожимая плечами) А там результат операции не используется. И да, когда я говорю «облажался, бывает» - это ко всем относится, в том числе - ко мне. Но я не называю дебилами тех, кто укажет мне на ошибку.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

А там результат операции не используется

а malloc тебе что возвращает? а open? ты что вообще никогда не проверяешь их результаты?

кто укажет мне на ошибку.

тогда ты вдвойне не прав, т.к. указал на неправильную ошибку - realloc там опять же для примера, в реальной жизни new может использовать свой аллокатор

wota ★★
()
Ответ на: комментарий от korvin_

А где просто? Фабрика она везде фабрика. Иногда правда ее зашивают в язык и получается что-то вроде delphi. Но нахер такую простоту.

anonymous
()
Ответ на: комментарий от const86

но если юзеру шибко надо будет
hell_ptr<Device> p(makeDevice(q).release());

То юзер - ССЗБ. Не нужно ориентироваться на полных идиотов, иначе можно самому таким стать. Что возвращать - вопрос дизайна и идеологии, и к тому, что хотел ОП, отношения не имеет. Я, кстати, только один раз видел middleware, из которого бы торчали смартпоинтеры.

dmfd
()
Ответ на: комментарий от korvin_

Там же написано, что создает объект указанного класса. А в исходном сообщении требуется, чтобы создавался не объект указанного класса, а объект одного из производных классов от указанного.

anonymous
()
Ответ на: комментарий от dmfd

Что возвращать - вопрос дизайна и идеологии, и к тому, что хотел ОП, отношения не имеет.

угу.

Я, кстати, только один раз видел middleware, из которого бы торчали смартпоинтеры.

хз, каждый пишет по своему, но если в ф-ции есть new, то лучше вернуть unique_ptr or auto_ptr(for older), ИМХО

Boy_from_Jungle ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.