Fj_
|
Carpal Tunnel
|
|
|
|
Рег.: 12.09.2004
|
Сообщений: 8795
|
|
Рейтинг: 3287
|
|
[C++] Где почитать про объявления классов внутри функций?
06.03.2008 13:25
|
|
|
Увидел в статье про 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
|
|
|
iso/iec 14882 9.8 Local class definitions
|
|
Fj_
|
Carpal Tunnel
|
|
|
|
Рег.: 12.09.2004
|
Сообщений: 8795
|
|
Рейтинг: 3287
|
|
|
Прикольно, спасибо.
|
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
|
|
|
Сообщение удалил nelapsi
|
Your touch will set me free |
|
aset
|
boar
|
|
|
|
Рег.: 05.09.2003
|
Сообщений: 36470
|
|
Рейтинг: 6913
|
|
|
|
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
|
|
|
Quote:
И вообще, в С++ вложенные классы для чего либо содержательного использовать почти невозможно
а какая вообще есть польза от декларации класса внутри функции? и с какой целью это было сделано? древнее наследие C?
|
|
aset
|
boar
|
|
|
|
Рег.: 05.09.2003
|
Сообщений: 36470
|
|
Рейтинг: 6913
|
|
|
У Александреску в книжке есть по этому поводу немного.
|
may have come in contact with nuts |
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31411
|
|
Рейтинг: 8953
|
|
Re: Плюсы, вопрос.
[re: aset]
06.03.2008 19:05
|
|
|
передавать своими словами можешь что там было?
ps если честно, то лень куда-то лезть ради удовлетворения небольшого любопытства 
|
|
Fj_
|
Carpal Tunnel
|
|
|
|
Рег.: 12.09.2004
|
Сообщений: 8795
|
|
Рейтинг: 3287
|
|
|
Да, странный, конечно. Там еще и функция возвращает const int - я случайно обнаружил, что и это возможно, причем до сих пор не понимаю, нафига это нужно, если она и так возвращает rvalue.
И не работает она, кстати, потому что я идиот и перепутал длину и страйд! =)
|
The data is the error (c)IIS FTP Server. |
|
aset
|
boar
|
|
|
|
Рег.: 05.09.2003
|
Сообщений: 36470
|
|
Рейтинг: 6913
|
|
|
Да я сейчас и сам не вспомню, а руку за книгой тянуть ломает.
|
may have come in contact with nuts |
|
Rebble
|
ханжа
|
|
|
|
Рег.: 13.08.2004
|
Сообщений: 3115
|
Из: highway2hell
|
Рейтинг: 8250
|
|
|
>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
|
|
|
В ответ на:
Там еще и функция возвращает 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
|
|
|
В ответ на:
имхо, лучше подстраховаться
Имхо, лучше положиться на предупреждения компилятора  Пробовал писать функции, которые возвращают 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
|
|
|
Quote:
а какая вообще есть польза от декларации класса внутри функции?
Quote:
древнее наследие C?
|
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31411
|
|
Рейтинг: 8953
|
|
|
например раньше было можно структуру внутри функции определять, теперь - класс.
зачем так тупить?
|
|
vozbu
|
karamba
|
|
|
|
Рег.: 14.11.2004
|
Сообщений: 4856
|
|
Рейтинг: 1057
|
|
|
В ответ на:
зачем так тупить?
Ну, может быть это в целях локализации использования? Надо тебе, например, объявить функтор, который ты используешь один раз в этой функции и забудешь. Если не объявлять его внутри функции, это надо делать где-то еще, например, в анонимном-неймспейсе прямо перед функцией, что не лишено недостатков, т.к. больше писать.
|
С тех пор, как изобрели речь, люди не могут договориться друг с другом.
 |
|
Attila
|
R
|
|
|
|
Рег.: 18.12.2002
|
Сообщений: 16118
|
Из: ...вот именно там.
|
Рейтинг: 3169
|
|
Re: Плюсы, вопрос.
[re: vozbu]
07.03.2008 16:22
|
|
|
так написали же, что в шаблонах локальные классы использовать нельзя
|
Кр-ть - с.т.! |
|
Bachan
|
god's pee
|
|
|
|
Рег.: 26.10.2002
|
Сообщений: 37551
|
|
Рейтинг: 5335
|
|
Re: Плюсы, вопрос
[re: vozbu]
07.03.2008 16:32
|
|
|
Quote:
P.P.S. Некоторые для защиты от такого пишут if (2 == zzz(1))
да, я уже давно на автомате так пишу. ))
|
я АЭС фачил в эсс! |
|
junkie
|
journeyman
|
|
|
|
Рег.: 07.03.2005
|
Сообщений: 52
|
|
Рейтинг: 15
|
|
|
Писать if (2 == z) это ухудшать читаемость кода. Например, MS компилятор с опцией /w4 выдаст ворнинг, если напишешь так if (z=2) . а if( z() = 2 ) - просто нельзя писать по стандарту.
|
|