Читать вдумчиво, с придыханием, каждое утро по 128 раз
“Порядок вызова конструкторов членов класса определяется только порядком их появления в объявлении класса. Список инициализации порядок не определяет”!
Полдня убил сегодня на поиск бага. Был класс с членом-смартпоинтером и еще одним членом, который инициируется таким же смартпоинтером:
class MyClass{
public:
MyClass(SmartPointerToSomeThing);
private:
SomeOtherClass m_OtherClass;
SmartPointerToSomeThing m_VeryImportantSmartPointer;
};
MyClass::MyClass(SmartPointerToSomeThing Ptr):
m_VeryImportantSmartPointer(Ptr),
m_OtherClass(m_VeryImportantSmartPointer) ///< fuck up is here
{
}
// Has to be instead:
MyClass::MyClass(SmartPointerToSomeThing Ptr):
m_VeryImportantSmartPointer(Ptr),
m_OtherClass(Ptr) ///< Note - Ptr used instead of member
{
}
Что произошло в первом случае?
Да ничего страшного, просто члену нашего класс m_OtherClass подсовывался еще не инициализированный экземпляр умного указателя. А не инициализирован он был потому, что в интерфейсе класса самрт поинтер этот объявлен позже m_OtherClass.
Что интересно, найти такой баг может быть очень-очень-очень сложно.
0 Comments.