Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.fds-net.ru/showflat.php?Number=7286588&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Tue Apr 12 19:30:44 2016
Кодировка: Windows-1251
[C++] Где почитать про объявления классов внутри функций? - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | показать все | след. страница
Fj_
Carpal Tunnel

Рег.: 12.09.2004
Сообщений: 8795
Рейтинг: 3287
  [C++] Где почитать про объявления классов внутри функций?
      06.03.2008 13:25
2

Увидел в статье про C++0x упоминание о том, что классы можно объявлять внутри функций даже в стандартных плюсах. Проверил и действительно.

code:
#include <search.h> const int zzz(int i) { class Comparer { public: static int Compare(const void * a, const void * b) { return *(int*)a - *(int*)b; } }; int arr[] = {3, 2, 1}; qsort(arr, sizeof(int), 3, Comparer::Compare); return arr[i]; } int main() { return zzz(2); }


А вопрос, собственно, такой: где про это можно прочитать? У Страуструба что-то не нашел. Может, это такое секретное знание?





Редактировал DarkGray (06.03.2008 18:39)
The data is the error (c)IIS FTP Server.
junkie
journeyman

Рег.: 07.03.2005
Сообщений: 52
Рейтинг: 15
  Re: Плюсы, вопрос. [re: Fj_]
      06.03.2008 14:06
4

iso/iec 14882 9.8 Local class definitions

Fj_
Carpal Tunnel

Рег.: 12.09.2004
Сообщений: 8795
Рейтинг: 3287
  Re: Плюсы, вопрос. [re: junkie]
      06.03.2008 15:01
2

Прикольно, спасибо.



The data is the error (c)IIS FTP Server.
nelapsi
the wumbologist

Рег.: 10.11.2003
Сообщений: 10758
Из: Orbis Tertius
Рейтинг: 10651
  Re: Плюсы, вопрос. *DELETED* [re: Fj_]
      06.03.2008 17:55
-1

Сообщение удалил nelapsi



Your touch will set me free
aset
boar

Рег.: 05.09.2003
Сообщений: 36470
Рейтинг: 6913
  Re: Плюсы, вопрос. [re: nelapsi]
      06.03.2008 17:56
1

http://www.kuzbass.ru:8086/docs/isocpp/



may have come in contact with nuts
Rebble
ханжа

Рег.: 13.08.2004
Сообщений: 3115
Из: highway2hell
Рейтинг: 8250
  Re: Плюсы, вопрос. [re: Fj_]
      06.03.2008 18:10
 

code:
class Comparer { public: static int Compare(const void * a, const void * b) { return *(int*)a - *(int*)b; } }; int arr[] = {3, 2, 1}; qsort(arr, sizeof(int), 3, Comparer::Compare);


Очень странный пример. На С++ такой код никто не пишет. И вообще, в С++ вложенные классы для чего либо содержательного использовать почти невозможно - например, они не могут быть параметрами шаблона (т.е. STL с ними никак не сочетается).



And so much crap makes you blind
DarkGrayМодератор
Carpal Tunnel

Рег.: 30.09.2002
Сообщений: 31411
Рейтинг: 8953
  Re: Плюсы, вопрос. [re: Rebble]
      06.03.2008 18:41
1

Quote:

И вообще, в С++ вложенные классы для чего либо содержательного использовать почти невозможно




а какая вообще есть польза от декларации класса внутри функции?
и с какой целью это было сделано? древнее наследие C?

aset
boar

Рег.: 05.09.2003
Сообщений: 36470
Рейтинг: 6913
  Re: Плюсы, вопрос. [re: DarkGray]
      06.03.2008 19:00
2

У Александреску в книжке есть по этому поводу немного.



may have come in contact with nuts
DarkGrayМодератор
Carpal Tunnel

Рег.: 30.09.2002
Сообщений: 31411
Рейтинг: 8953
  Re: Плюсы, вопрос. [re: aset]
      06.03.2008 19:05
1

передавать своими словами можешь что там было?

ps
если честно, то лень куда-то лезть ради удовлетворения небольшого любопытства :)

Fj_
Carpal Tunnel

Рег.: 12.09.2004
Сообщений: 8795
Рейтинг: 3287
  Re: Плюсы, вопрос. [re: Rebble]
      06.03.2008 19:09
2

Да, странный, конечно.
Там еще и функция возвращает const int - я случайно обнаружил, что и это возможно, причем до сих пор не понимаю, нафига это нужно, если она и так возвращает rvalue.

И не работает она, кстати, потому что я идиот и перепутал длину и страйд! =)



The data is the error (c)IIS FTP Server.
aset
boar

Рег.: 05.09.2003
Сообщений: 36470
Рейтинг: 6913
  Re: Плюсы, вопрос. [re: DarkGray]
      06.03.2008 19:09
1

Да я сейчас и сам не вспомню, а руку за книгой тянуть ломает.



may have come in contact with nuts
Rebble
ханжа

Рег.: 13.08.2004
Сообщений: 3115
Из: highway2hell
Рейтинг: 8250
  Re: Плюсы, вопрос. [re: Rebble]
      06.03.2008 19:17
1

>qsort(arr, sizeof(int), 3, Comparer::Compare);

Тут вообще-то тупо баг, потому что у кусорта второй параметр - это кол-во элементов, а третий - размер элемента. Это типичнейший пример ошибки, которую невозможно было бы сделать, пользуясь нормальным С++ (т.е. std::sort() ).

Еще один из самых популярных источников безблагодатности - это void*, которым qsort тоже болен.



And so much crap makes you blind
alexk
addict

Рег.: 26.10.2003
Сообщений: 571
Рейтинг: 6
  Re: Плюсы, вопрос [re: Fj_]
      06.03.2008 21:04
2

В ответ на:

Там еще и функция возвращает const int - я случайно обнаружил, что и это возможно, причем до сих пор не понимаю, нафига это нужно, если она и так возвращает rvalue.




Это иногда спасает от глупых от глупых ошибок наподобие
code:
if ( zzz(1) = 2 ) {/*...*/}


Для функции это особо не нужно, но может быть полезно для всяких операторов:
code:
struct A { //... int operator[](size_t Index) {/*...*/} }; voif f() { A a; a[1] = 2; }


Особенно просто на такую ошибку нарваться в шаблонном коде.

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


vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  Re: Плюсы, вопрос [re: alexk]
      07.03.2008 09:28
4

В ответ на:

имхо, лучше подстраховаться



Имхо, лучше положиться на предупреждения компилятора :)
Пробовал писать функции, которые возвращают const int, const double и прочие константны типы, но потом понял, что выглядит по-уродски.
P.S. Мое имхо, не бейте :)
P.P.S. Некоторые для защиты от такого пишут if (2 == zzz(1)), что, конечно, не спасет от опечатки if (zzz(1) = zzz(2)), если компилятор не поможет.
P.P.P.S. gcc на код if ( zzz(1) = 2 ) вообще ошибку выдает и без const.



С тех пор, как изобрели речь, люди не могут договориться друг с другом.
horror
гонобобель

Рег.: 30.09.2002
Сообщений: 3784
Рейтинг: 2135
  Re: Плюсы, вопрос. [re: DarkGray]
      07.03.2008 11:06
5


 
Quote:


а какая вообще есть польза от декларации класса внутри функции?




Quote:


 древнее наследие C?




 :shocked:

DarkGrayМодератор
Carpal Tunnel

Рег.: 30.09.2002
Сообщений: 31411
Рейтинг: 8953
  Re: Плюсы, вопрос. [re: horror]
      07.03.2008 11:53
2

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

зачем так тупить? :confused:




vozbu
karamba

Рег.: 14.11.2004
Сообщений: 4856
Рейтинг: 1057
  Re: Плюсы, вопрос. [re: DarkGray]
      07.03.2008 15:45
1

В ответ на:

зачем так тупить?



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



С тех пор, как изобрели речь, люди не могут договориться друг с другом.
Attila
R

Рег.: 18.12.2002
Сообщений: 16118
Из: ...вот именно там.
Рейтинг: 3169
  Re: Плюсы, вопрос. [re: vozbu]
      07.03.2008 16:22
1

так написали же, что в шаблонах локальные классы использовать нельзя



Кр-ть - с.т.!
Bachan
god's pee

Рег.: 26.10.2002
Сообщений: 37551
Рейтинг: 5335
  Re: Плюсы, вопрос [re: vozbu]
      07.03.2008 16:32
1

Quote:

P.P.S. Некоторые для защиты от такого пишут if (2 == zzz(1))



да, я уже давно на автомате так пишу. ))



я АЭС фачил в эсс!
junkie
journeyman

Рег.: 07.03.2005
Сообщений: 52
Рейтинг: 15
  Re: Плюсы, вопрос [re: Bachan]
      07.03.2008 17:11
1

Писать if (2 == z) это ухудшать читаемость кода.
Например, MS компилятор с опцией /w4 выдаст ворнинг, если напишешь так if (z=2) .
а if( z() = 2 ) - просто нельзя писать по стандарту.


Страницы: 0 | 20 | показать все | след. страница

Technical >> Development (Archive)

Дополнительная информация
2 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы
>>
Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в