- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
SkinDog* crateDog()
{
return reinterpret_cast<SkinDog*>( new Dog() );
};
void deleteDog( SkinDog* pDog)
{
delete reinterpret_cast<Dog*>( pDog );
}
EvilDog::bite()
{
Dog* pDog = mutationDog();
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+38
SkinDog* crateDog()
{
return reinterpret_cast<SkinDog*>( new Dog() );
};
void deleteDog( SkinDog* pDog)
{
delete reinterpret_cast<Dog*>( pDog );
}
EvilDog::bite()
{
Dog* pDog = mutationDog();
Не удержался, чтоб не запостить. Сами знаете откуда.
bormand 17.09.2012 13:00 # +7
Что-за дикое ООП с reinterpret кастами?
interested 17.09.2012 13:36 # 0
И это называется "хорошим ооп" в "умных книжках" ;)
roman-kashitsyn 17.09.2012 13:44 # 0
К тому же, связный список - очень мощный и гибкий инструмент. Потому так много интерфейсов и реализует. Остальные коллекции в Java реализуют гораздо меньше интерфейсов.
bormand 17.09.2012 13:53 # 0
implements List<E>, Deque<E>, Cloneable, Serializable
4 != 100500
3.14159265 12.10.2012 17:01 # +1
List, который в свою очередь от Collection
И Collection, который в свою очередь от Iterable.
Java is simple!
roman-kashitsyn 12.10.2012 17:07 # +1
defecate-plusplus 17.09.2012 15:14 # +2
надо было весь постить, кстати
bormand 17.09.2012 15:56 # 0
defecate-plusplus 17.09.2012 16:17 # +2
bormand 17.09.2012 16:29 # +1
P.S. Мда, а автор всего лишь хотел PImpl... а ему тут такое сокрытие сбацали.
defecate-plusplus 17.09.2012 16:40 # 0
но если честно, не уловил сути начальной проблемы "нихачю чтобы пользователь моего кода знал, что для работы ему понадобится windows.h"
bormand 17.09.2012 16:44 # 0
defecate-plusplus 17.09.2012 16:50 # 0
bormand 17.09.2012 17:11 # +2
ЕМНИП, всякие WORD да POINT, и почти все APIшные функции замакрены.
P.S. Само собой, что в крестоблядском коде мало кто захочет описать свой WORD или POINT, и проблема по большей части надумана.
P.P.S. А вот макрос с именем CreateFile (если мне не изменила память, и они есть) может доставить неприятности.
defecate-plusplus 17.09.2012 17:37 # +1
просто windows.h у меня на работе в любом виндовом проекте инклюдится прямо в pch, и не сказать, чтобы я испытывал какой-то дискомфорт
видать, отсутствие конфликтов имен самостоятельно разруливается использованием stl/boost стиля - я в здравом уме свою функцию CreateFile не назову
bormand 17.09.2012 18:42 # +1
Поэтому против включения windows.h в проект я ничего не имею, а в либу, которую впоследствии будут юзать другие - не стоит.
TarasB 17.09.2012 21:24 # 0
defecate-plusplus 17.09.2012 21:47 # 0
сишкопроблемы ты хотел сказать
все претензии только к дефайнам и любви микрософта к TCHAR (#ifdef UNICODE...), имеющей очевидное историческое обоснование
bormand 17.09.2012 21:52 # +1
TarasB 18.09.2012 18:33 # 0
LispGovno 18.09.2012 19:43 # −1
Комитет не принял. Proposal на это был для С++11.
interested 18.09.2012 21:22 # +1
Можно задефайнить nsp как namespace, и писать везде nsp вместо namespace.
А можно препроцессировать файлы LaTeX.
TarasB 19.09.2012 18:07 # +1
interested 20.09.2012 09:06 # +1
LispGovno 20.09.2012 02:37 # −1
Почему не срабатывает перемещающий конструктор?
Как видно перемещающий конструктор на месте:
http://en.cppreference.com/w/cpp/io/basic_fstream/basic_fstream
defecate-plusplus 20.09.2012 07:42 # +2
см
LispGovno 20.09.2012 09:02 # 0
Есть идеи, как переписать, чтобы работало в if уже сейчас или даже в старом стандарте?
defecate-plusplus 20.09.2012 09:37 # +1
потому что там всё жутко ограничено
c++03 6.4 Selection statement в с++11 в condition добавилась еще возможность инициализации через {}, что по сути тоже copy/move construction, а не direct
LispGovno 20.09.2012 11:21 # 0
Или даже так работает:
Так что не понятно, почему код выше не компилируется (не считая того, что move конструктор не определен) или ещё лучше следующий код (который тоже не компилируется):
defecate-plusplus 20.09.2012 11:29 # +2
я же всё описал
конструктор без имени переменной - приводится к expression
выражение с = тоже описано в стандарте
а выражение, содержащее имя переменной и direct constructor (через скобки) - не описано
поэтому все компиляторы его и не поддерживают
поэтому внутри if с = будет работать, только когда заработает move ctor для ifstream
а так - только вынос переменной до if
LispGovno 20.09.2012 11:41 # 0
Это путь по помойке. Сколько лишних конструкций приходится городить... Одни наружние {} вокруг всей конструкции стрима чего стоят...
В том же сишарпике все намного короче:
LispGovno 20.09.2012 11:43 # 0
Кстати, для любителей сишарпика, после чего file будет закрыт? Или уже никогда не будет, пока сборка мусора не произойдет?
3.14159265 12.10.2012 17:15 # +1
А с чего это ему вдруг закрываться? Пока Dispose не вызовет кто-то. Ну этот кто-то и будет GC:
CLR ведь не знает - когда ты захочешь еще с этого файла что-то прочитать.
Другое дело, что GC может оказаться умным и если var file будет в методе, без публикации наружу, то он его соберет при выходе из этого метода.
bormand 12.10.2012 17:24 # 0
А может и не оказаться. Поэтому я не стал бы полагаться на судьбу, и закрыл бы файл самостоятельно. Неприятно будет, если программе понадобится через несколько секунд открыть файл, а гц его еще не закрыл.
guest 12.10.2012 17:50 # 0
defecate-plusplus 20.09.2012 11:45 # +2
это само по себе странно, когда есть
std::ifstream file("kakaka");
а вместо скобок всегда можно сделать file.close(); в нужном месте, раз оно так жжотся, что не дотерпит до выхода из внешнего scope
LispGovno 20.09.2012 11:47 # 0
defecate-plusplus 20.09.2012 11:50 # +2
крестотравма дает рецидив, приносит тяжкие душевные страдания
LispGovno 20.09.2012 11:54 # 0
LispGovno 20.09.2012 11:29 # 0
Я правильно понял псевдокод этой конструкции?
Получается в принципе нельзя вызвать конструктор с нужным кол-вом параметров, а только default constructor и assigment operator?
defecate-plusplus 20.09.2012 11:38 # +1
в с++ в общем случае выполняется в последовательности
т.е. выражение должно удовлетворять стандарту (для fstream не удовлетворяет, потому что copy ctor сокрыт, а move написать за год энтузиасты не сдюжили)
а затем уже работает оптимизатор, который может элиминировать ненужные временные объекты
в принципе, copy initialization vs direct initialization на ГК уже обсуждалось
LispGovno 20.09.2012 11:49 # 0
А где можно почитать и набраться уму разуму?
defecate-plusplus 20.09.2012 11:57 # +2
http://govnokod.ru/11600#comment151119
LispGovno 20.09.2012 11:32 # 0
defecate-plusplus 20.09.2012 11:40 # 0
TarasB 20.09.2012 11:57 # +3
eth0 20.09.2012 16:07 # +8
roman-kashitsyn 20.09.2012 16:11 # +6
defecate-plusplus 20.09.2012 16:16 # +9
roman-kashitsyn 20.09.2012 16:16 # +3
TarasB 20.09.2012 19:03 # +3
guest 12.10.2012 16:26 # 0
Компилится. Шо скажите посоны?
defecate-plusplus 12.10.2012 16:38 # 0
defecate-plusplus 12.10.2012 17:23 # 0
все таки ГК - полезный сайт
с++03 и с++11: п. 12.2/5
вкратце - в данном примере временный объект, на который ссылается ссылка, будет уничтожен только когда будет уничтожаться ссылка
гуест (он же гумно, он же ламер007) таки заставил с++ делать using :)
guest 12.10.2012 21:20 # 0
Ничего я посоны не нашел. Так как пользоваться константным ссылками на файл бесполезно даже для чтения :(
А не константная понятно не скомпилится:
Зато я нашел такой вариант:
guest 12.10.2012 21:25 # 0
Этот вариант лучше auto file, тк последний предпологает вызов перемещающего конструктора, что не оптимально (Имею ввиду не конкретно файлы, а using паттерн в целом, тк он применим не только для файлов).
roman-kashitsyn 12.10.2012 22:20 # +3
Очень сильный аргумент.
Я не боюсь того, кто изучает 10,000 различных ударов. Я боюсь того, кто изучает один удар 10,000 раз
(с) Брюс Ли
guest 12.10.2012 22:44 # 0
defecate-plusplus 12.10.2012 22:25 # 0
но решение так очевидно!
http://liveworkspace.org/code/1ee1eb80806e9665c48be78d273b44cd
guest 12.10.2012 22:50 # 0
Мне ещё одна наркоманская мысль пришла: Написать перемещающий оператор приведения к типу? Но это пожалуй отложим до дождичка в четверг.
guest 12.10.2012 21:28 # 0
Это не работает в старом стандарте. Хотябы из-за auto. Есть у кого идеи, как реализовать using в старом стандарте?
defecate-plusplus 12.10.2012 22:16 # 0
guest 12.10.2012 22:51 # 0
guest 12.10.2012 23:14 # 0
using, С++, старый стандарт:
http://liveworkspace.org/code/bf5b986361f4b638a71cb8629ff5f584
roman-kashitsyn 13.10.2012 00:19 # 0
2. Твой макрос ломает вложенные конструкции if. Я понимаю, что это для лулзов, но неокрепшие умы с геймдева ведь и вправду заюзают...
guest 13.10.2012 01:18 # 0
guest 13.10.2012 01:19 # 0
http://liveworkspace.org/code/4600ad70040f6ad89187836fa2fc32f9
guest 13.10.2012 01:33 # 0
> Так лучше?
Хм. Это никак не поможет... Плохой макрос...
guest 13.10.2012 08:17 # 0
Превратил кресты в паскаль, посему доволен. Таким образом избавлюсь от проблем рассинхронизации if else \ ; .
Дальше осталось сделать так бля большой паскализации:
guest 13.10.2012 08:19 # 0
RAII снова восторжествовало!
guest 13.10.2012 16:06 # 0
Ты меня заинтересовал. Пожалуй я перейду с дельфей на кресты.
TarasB 13.10.2012 16:36 # 0
guest 13.10.2012 16:51 # 0
bormand 13.10.2012 16:58 # 0
Он спрятался за многоточием...
guest 13.10.2012 17:49 # 0
Посчитать кол-во строк в файле хедера, чтобы begin в крестах заработал также как в delphi.
bormand 13.10.2012 21:32 # 0
Учительница в школе задала тебе эту задачку? Ну уж нет, решай ее сам ;)
LispGovno 14.10.2012 15:13 # 0
bormand 14.10.2012 16:04 # +1
Угу. Фактически в одно действие.
TarasB 14.10.2012 16:52 # +2
LispGovno 14.10.2012 17:33 # −2
guest 13.10.2012 19:34 # 0