Сигнатура int& foo()=7

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Andriy_abc
Сообщения: 4
Зарегистрирован: 31 мар 2014, 19:01

Друзья,

это чисто теоретический вопрос. Подскажите где может быть использована такая функция. Какой в этом практический смысл?

int& foo()=7;

Детали: тип не принципиален, целый взят просто в качестве примера.

Большое спасибо заранее.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Вероятнее всего в каких либо расчетах какое то значение используется как константа, но возможно и использование функции. С точки зрения рефакторинга это православно, т.к. не приходится переделывать весь расчет, а достаточно изменить саму функцию. Наиболее вероятно, что эта же функция используется в разных участках кода и это тем более, с избытком ее оправдывает.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А по-русски?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
C:\Projects\test\test.cpp|3|error: invalid pure specifier (only '= 0' is allowed) before ';' token|
C:\Projects\test\test.cpp|3|error: function 'int& foo()' is initialized like a variable|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
...........................
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Я не знаю, откуда взят этот пример, но синтаксис такой функции неверен и это никогда не скомпилируется.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andriy_abc
Сообщения: 4
Зарегистрирован: 31 мар 2014, 19:01

Большое спасибо
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Именно в таком варианте данное выражение синтаксически ошибочно.
Однако, можно рассмотреть несколько вариантов с незначительными исправлениями, при которых данный код сможет работать.


Код cpp:
#include "stdafx.h"


int& foo()
{
static int var = 0;
return var;
}


int _tmain(int argc, _TCHAR* argv[])
{
int& a = foo() = 7; // добавить переменную
_tprintf(_T("%d\n"), a);

foo() = 10; // избавиться от типа
_tprintf(_T("%d\n"), foo());


return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Мне пришёл в голову ещё один вариант с небольшим исправлением. Если 7 заменить на ноль и разместить это объявление внутри класса, то мы получим объявление чисто виртуального метода:

Код: Выделить всё

class CSomeClass
{
public:
   virtual int& foo() = 0;
};
Если будет интересно, что такое чисто виртуальный метод, дай знать, и я расскажу подробнее.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andriy_abc
Сообщения: 4
Зарегистрирован: 31 мар 2014, 19:01

WinMain писал(а):Именно в таком варианте данное выражение синтаксически ошибочно.
Однако, можно рассмотреть несколько вариантов с незначительными исправлениями, при которых данный код сможет работать. ...............

Большое спасибо за вариант, думаю такое применение - один из наиболее приемлемых вариантов реализации.
Ответить