Member 13010616 Ответов: 2

Как это, что это может произойти?


Их электронная таблица /*затем a*/ CreateObject(){} //я не понимаю, как это законно.
Что это значит?

Spreadsheet CreateObject() { return Spreadsheet(3, 2); };
int main(){ }


Что я уже пробовал:

Их электронная таблица /*затем a*/ CreateObject(){} //я не понимаю, как это законно.
Что это значит?


Электронная таблица CreateObject() { возвращает электронную таблицу(3, 2); };
тап_п(){ }

Mohibur Rashid

О чем конкретно вы говорите?

2 Ответов

Рейтинг:
14

KarstenK

Это реализация функции в формате Object function body любить

int func() { return 0; }; 
Это не очень хорошая идея для объектов, потому что объект электронной таблицы выделяется в теле функции, а копия-в стеке.

Лучше всего работать с указателями объектов:
Spreadsheet* CreateObject() { return new Spreadsheet(3, 2); };
Который вы не будете записывать в функцию. И вам нужно удалить электронную таблицу* где-то.


Рейтинг:
1

CPallini

Это совершенно законно (и идиоматично) C++ код, обусловленный РВО[^] обычно нет потери производительности.


KarstenK

Спасибо за информацию. Но у него есть свои ловушки: https://docs.microsoft.com/en-us/previous-versions/ms364057(v=против 80)

CPallini

Добро пожаловать. Ловушки? Ты знаешь, C++ у него их тонны. На самом деле программирование на C++ похоже на игру в сапер. :-D
Кстати, использование "голого нового" в наши дни также не рекомендуется, в пользу умных указателей, см., например:
https://docs.microsoft.com/en-us/cpp/cpp/smart-pointers-modern-cpp?view=vs-2017
Это ничего не стоит, статья, в свою очередь, немного устарела:
auto song2 = make_unique<song>(L"Nothing on You", L"Bruno Mars");
было бы предложено, сегодня :-)

KarstenK

Умные указатели-это хороший момент.

Мои навыки C++ теперь немного "старой школы"... ;-)