Это архив сайта coldflame.by.ru, он не обновлялся с 2007 года. Мой современный сайт тут: http://leonid.shevtsov.me.
Домой! Обо мне Специально для РИ-06-1 Разнообразное... барахло, короче :) Программы и прочее Статьи и переводы Блог SmartDaemon

Премудрости 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), надо все функции реализовывать в заголовке, а иначе невозможно будет их скомпилить!!!