|
Премудрости C++Пища для размышлений.Visual C++ 6.0 НЕСОВМЕСТИМ со стандартом ISO C++ 99 года! И как можно в этой среде изучать C++ в универах? И почему нельзя использовать GNU С++, хотя бы MinGW? Последовательность операцийCначала выполняется сравнение, а потом битовые операции! if ( 1 & 0x10 != 0 ) ...Такой вот код всегда дает верное условие. Почему? Потому что (0x10 != 0) = 1, а 1 & 1 = true. Из-за этой ошибки два часа не работал код проверки одного флага %( А надо было вот так: if ( (1 & 0x10) != 0 ) ... Итераторы STLВ работе с итераторами STL, в цикле for надо использовать for (i=coll.begin();i!=coll.end();++i)т.е. != а не < - еще одна ламерская ошибка. Координаты OpenGLВ OpenGL СНАЧАЛА указывать текстурные (и т.п.) координаты, а ПОСЛЕДНИМИ указывать координаты вершин! Удаление объектов из списка указателей (с вызовом деструктора!)Хитрожопейшая функция удаления объектов из списка STL с вызовом деструктора:
for (list<TimerEvent*>::iterator=pEvents.begin();pos!=pEvents.end();++pos)
{
if ((*pos)->pTimerState==TimerEvent::state_must_destroy)
{
//тут метим объект 0 и деструктим
TimerEvent* ev=(*pos);
(*pos)=0;
delete ev;
} else
if ((*pos)->pTimerState==TimerEvent::state_must_remove)
//а тут - только метим, а объект остается в памяти
(*pos)=0;
}
//теперь удаляем все нули - и дело в шляпе!
pEvents.remove(0);
Суть в том, что сначал удаляем, потом метим нулями, потом удаляем все нули!
Определение шаблоновДля того, чтобы использовать шаблоны (templates), надо все функции реализовывать в заголовке, а иначе невозможно будет их скомпилить!!! |
| © 2007 coldFlame aka Леонид Шевцов |
|
|