подобное действие?
P.S. да, это не работает, но вот с каких слов гуглить не пойму
B getSomeObject()
{
return A(...);
}
B b = getSomeObject();
b.member_That_Only_A_has();
no, class A : public B
Про это стоило написать, что A от B отнаследован
Упс, совсем у меня крыша едет ночью) Писал с этой информацией, потом почему-то удалил..
В таком случае код сверху правильно заставить работать сложно без модификаций: в строчке B b = getSomeObject(); просиходит срезка: содержимое объекта A теряется, остается только та часть, что принадлежала объекту B Динамический полиморфизм в плюсах работает через ссылки или указатели: нужно иметь либо ссылку, либо указатель на базовый класс, чтоб работать с наследникми через него
М, понятненько, спасибо, пойду думать, чтоб такого сварганить для обхода)
А что не нравится? Аллокация лишняя?
Да тут дело вот в чем. У меня условно много классов, унаследованных от базового класса. И функция, которая должна возвращать любой из унаследованных классов. Но при этом хотелось бы, чтобы результат работы функции не нужно было бы переписывать в зависимости от результата. Довольно банальная задача. В шарпе, например, для этого удобный Interface завезли) В плюсах же, похоже, нужно повозиться
В шарпах там будет такая же аллокация
МмМм) Я явно что-то упустил при изучении данного материала :/\
Надо вернуть полиморфный объект — возвращай std::unique_ptr<A> по умолчанию
Ахах, ну, типа, функция, которая возвращает объект-наследник прямиком в объект-родитель. Вроде было какое-то словечко сочетание :(
Да, падает с грохотом)
хаха, idk) maybe
Там выход был лишь в том, чтобы возвращать указатели и прочие подобные танцы с бубном. Но хотелось чего-нить более стройного. Опять же в шарпе можно бахнуть интерфейс, родить на его основе пару сущностей и потом возвращать их на право и налево прямо в этот самый интерфейс (да, буквально там это так не происходит, но выглядит со стороны именно так, и, к слову, это чертовски удобно).
Короче это примеси срезки и type (UN)safe downcast. Не понятно зачем это обсуждать
Была проблема, вот и обсуждали) Теперь проблема испарилась.. ..ибо я слепил костыль _(*-*)_
Чё ты хочешь? Нет ничего в шарпе чего бы не было в с++
По значению это не возможно. Только по ссылке
)))) На базовом уровне - вполне возможно. Но с точки зрения некоторого удобства с теми же самыми интерфейсами - плюсы, пожалуй, курят в сторонке)
Так, а в каком смысле "возвращать любой из унаследованных классов"?
В буквальном. Есть класс Object. Я наследуюсь от него классами Object1, Object2 и Object3. Потом функция возвращает любой из экземпляров наследников. А в месте вызова функции мы принимаем Object)
Вот делай это все по ссылке, как и делает Си Шарп (просто потому что по другому не умеет) И все будет шикарно
Ты в курсе, какого типа o в Object o; В C# ?
Невозможно
Просто return T(); где T - один из типов?
Вопрос с подвохом.. :/
ну тип
МмМмМм, влетели в оффтоп :D
Ещё раз, в СИ Шарп нет никаких языковых возможностей, которых нет в с++.
Так ответь
Я согласен, но, очевидно, есть вещи, которые в шарпе делаются удобнее, нежели в плюшках)
Там лишь сахаром обложено...
так это и означает, что делается удобнее, нет?
Об этом я и глаголю!)
Гхмхмх, предположим, Object
Не всегда. Может означать, что делается по другому
Ну так какой это тип то блять? Ты Си Шарп то знаешь?
Nope, sir
разве? пример можно?
Ахах, но суть "сахара" же в том, что удобнее)
Object тут название класса
Ьтаак
Вот его всратое использование значений и есть пример
o.GetType() или вы о чем?
Object o; o - объектная ссылка. Вот и делай так же в С++. Какого хуя ты про значению объекты возвращать решил - не понятно совсем
Я именно о том что я написал. Object - имя класса o - переменная, объектная ссылка
вообще бтв если та задачка уже решена, то можно бросить, если нет - мне было бы интересно послушать что именно планируется сделать этой штукой
SooOory, sir, но я где то упоминал про желание возвращать по значению? :F
просто как-будто на шаблонах что-то такое можно реализовать. Мол, если входной параметр имеет тип T, то создаем и возвращаем объект типа T
так, что реализовать на шаблонах
ну у меня в голове сложилось, что мы можем передавать в параметры функции тип, который хотим получить. Либо он как-то напрямую мб от входного параметра зависит, тогда можем прям auto foo(T a) -> T {} оч условно
Kelbon
Да, на шаблонах можно, но все равно неудобно, так как вызывая функцию нужно ожидать определенный тип.
Так твой код-то что? По значению.
Нет, нельзя.
Там это были бы РАЗНЫЕ ФУНКЦИИ. А тут одна должна быть, полиморфная, как я понял по задумке.
ток он потом еще раз обьяснял, если что
Покажи..
Да, это верно, хотя там я показывал все же желаемый результат, который, очевидно, невозможен)
Возможен
И ещё раз. В С# это возможно, потому что возвращаемое значение - полиморфная объектная ссылка на объект базового класса (который один в С#). Делай точно так же и в С++, и все будет ок. Да, синтаксис в с++ для этого другой. Надо добавлять к типу & или *.
главное случайно не вернуть по ссылке из функции)))
Спасибо тебе, направил на путь истинный :3 P.S. про шарповую инфу также благодарствую :*)
Норм: int& hardcore() { return *(new int); // fucking fuel economy }
ну понятно же что я про временные объекты
Так нет же, именно так и надо делать! В данном случае
Не, не понятно
тогда нужно это правильно делать
Обсуждают сегодня