170 похожих чатов

Сижу уже минут 15 и не могу понять, как называется

подобное действие?

P.S. да, это не работает, но вот с каких слов гуглить не пойму

B getSomeObject()
{
return A(...);
}

B b = getSomeObject();
b.member_That_Only_A_has();

68 ответов

20 просмотров
ZERDICORP- Автор вопроса

no, class A : public B

Про это стоило написать, что A от B отнаследован

ZERDICORP- Автор вопроса

Упс, совсем у меня крыша едет ночью) Писал с этой информацией, потом почему-то удалил..

В таком случае код сверху правильно заставить работать сложно без модификаций: в строчке B b = getSomeObject(); просиходит срезка: содержимое объекта A теряется, остается только та часть, что принадлежала объекту B Динамический полиморфизм в плюсах работает через ссылки или указатели: нужно иметь либо ссылку, либо указатель на базовый класс, чтоб работать с наследникми через него

ZERDICORP- Автор вопроса

М, понятненько, спасибо, пойду думать, чтоб такого сварганить для обхода)

А что не нравится? Аллокация лишняя?

ZERDICORP- Автор вопроса

Да тут дело вот в чем. У меня условно много классов, унаследованных от базового класса. И функция, которая должна возвращать любой из унаследованных классов. Но при этом хотелось бы, чтобы результат работы функции не нужно было бы переписывать в зависимости от результата. Довольно банальная задача. В шарпе, например, для этого удобный Interface завезли) В плюсах же, похоже, нужно повозиться

В шарпах там будет такая же аллокация

ZERDICORP- Автор вопроса

МмМм) Я явно что-то упустил при изучении данного материала :/\

Надо вернуть полиморфный объект — возвращай std::unique_ptr<A> по умолчанию

ZERDICORP- Автор вопроса

Ахах, ну, типа, функция, которая возвращает объект-наследник прямиком в объект-родитель. Вроде было какое-то словечко сочетание :(

ZERDICORP- Автор вопроса

Да, падает с грохотом)

ZERDICORP- Автор вопроса

хаха, idk) maybe

ZERDICORP- Автор вопроса

Там выход был лишь в том, чтобы возвращать указатели и прочие подобные танцы с бубном. Но хотелось чего-нить более стройного. Опять же в шарпе можно бахнуть интерфейс, родить на его основе пару сущностей и потом возвращать их на право и налево прямо в этот самый интерфейс (да, буквально там это так не происходит, но выглядит со стороны именно так, и, к слову, это чертовски удобно).

Короче это примеси срезки и type (UN)safe downcast. Не понятно зачем это обсуждать

ZERDICORP- Автор вопроса

Была проблема, вот и обсуждали) Теперь проблема испарилась.. ..ибо я слепил костыль _(*-*)_

Чё ты хочешь? Нет ничего в шарпе чего бы не было в с++

По значению это не возможно. Только по ссылке

ZERDICORP- Автор вопроса

)))) На базовом уровне - вполне возможно. Но с точки зрения некоторого удобства с теми же самыми интерфейсами - плюсы, пожалуй, курят в сторонке)

Так, а в каком смысле "возвращать любой из унаследованных классов"?

ZERDICORP- Автор вопроса

В буквальном. Есть класс Object. Я наследуюсь от него классами Object1, Object2 и Object3. Потом функция возвращает любой из экземпляров наследников. А в месте вызова функции мы принимаем Object)

Вот делай это все по ссылке, как и делает Си Шарп (просто потому что по другому не умеет) И все будет шикарно

Ты в курсе, какого типа o в Object o; В C# ?

Невозможно

Просто return T(); где T - один из типов?

ZERDICORP- Автор вопроса

Вопрос с подвохом.. :/

ZERDICORP- Автор вопроса

ну тип

ZERDICORP- Автор вопроса

МмМмМм, влетели в оффтоп :D

Ещё раз, в СИ Шарп нет никаких языковых возможностей, которых нет в с++.

Так ответь

ZERDICORP- Автор вопроса

Я согласен, но, очевидно, есть вещи, которые в шарпе делаются удобнее, нежели в плюшках)

Там лишь сахаром обложено...

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

ZERDICORP- Автор вопроса

Об этом я и глаголю!)

ZERDICORP- Автор вопроса

Гхмхмх, предположим, Object

Не всегда. Может означать, что делается по другому

Ну так какой это тип то блять? Ты Си Шарп то знаешь?

ZERDICORP- Автор вопроса

Nope, sir

разве? пример можно?

ZERDICORP- Автор вопроса

Ахах, но суть "сахара" же в том, что удобнее)

Object тут название класса

ZERDICORP- Автор вопроса

Ьтаак

Вот его всратое использование значений и есть пример

o.GetType() или вы о чем?

Object o; o - объектная ссылка. Вот и делай так же в С++. Какого хуя ты про значению объекты возвращать решил - не понятно совсем

Я именно о том что я написал. Object - имя класса o - переменная, объектная ссылка

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

ZERDICORP- Автор вопроса

SooOory, sir, но я где то упоминал про желание возвращать по значению? :F

просто как-будто на шаблонах что-то такое можно реализовать. Мол, если входной параметр имеет тип T, то создаем и возвращаем объект типа T

так, что реализовать на шаблонах

ну у меня в голове сложилось, что мы можем передавать в параметры функции тип, который хотим получить. Либо он как-то напрямую мб от входного параметра зависит, тогда можем прям auto foo(T a) -> T {} оч условно

Kelbon

ZERDICORP- Автор вопроса

Да, на шаблонах можно, но все равно неудобно, так как вызывая функцию нужно ожидать определенный тип.

Так твой код-то что? По значению.

Нет, нельзя.

Там это были бы РАЗНЫЕ ФУНКЦИИ. А тут одна должна быть, полиморфная, как я понял по задумке.

ток он потом еще раз обьяснял, если что

Покажи..

ZERDICORP- Автор вопроса

Да, это верно, хотя там я показывал все же желаемый результат, который, очевидно, невозможен)

Возможен

И ещё раз. В С# это возможно, потому что возвращаемое значение - полиморфная объектная ссылка на объект базового класса (который один в С#). Делай точно так же и в С++, и все будет ок. Да, синтаксис в с++ для этого другой. Надо добавлять к типу & или *.

главное случайно не вернуть по ссылке из функции)))

ZERDICORP- Автор вопроса

Спасибо тебе, направил на путь истинный :3 P.S. про шарповую инфу также благодарствую :*)

Норм: int& hardcore() { return *(new int); // fucking fuel economy }

ну понятно же что я про временные объекты

Так нет же, именно так и надо делать! В данном случае

Не, не понятно

тогда нужно это правильно делать

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта