Если у кого-нибудь найдётся минутка-другая, посмотрите проектик. Исходники тут. Я не стал убирать *.dll и *.a от QGLViewer'а и инклюды от QGLViewer'а и Eigen'а. Так чтоб под Windows собиралось "из коробки"...
Я первый раз пишу на ++ и проект только-только начинается. Так что там много методов-пустышек и "говнокода".
Собственно, беда такая. Есть у нас класс (молекула)
namespace Chemistry
{
class Molecule
{
public:
...
private:
typedef QList<Chemistry::Bond*> IncidenceList;
typedef QList<IncidenceList> IncidenceMatrix;
IncidenceMatrix incidenceMatrix_;
QList<Chemistry::Bond*> chemistryBonds_;
QList<Chemistry::Atom*> chemistryAtoms_;
...
};
}
В Render::Viewer попытка использовать экземпляр этого класса
namespace Render
{
class Viewer : public QGLViewer
{
Q_OBJECT
public:
...
protected:
...
private:
Chemistry::Molecule chemistryMolecule_;
...
};
}
Попытка не совсем успешная. Когда отрабатывает конструктор Chemistry::Molecule, все 3 списка инициализируются.
При попытке добавить атом в Render::Viewer::mousePressEvent в самом начале ставим точку останова:
Вот. Куда то пропал incidenceMatrix_. Куда?
А самое интересное. Если в объявлении поменять местами скажем так:
private:
typedef QList<Chemistry::Bond*> IncidenceList;
typedef QList<IncidenceList> IncidenceMatrix;
QList<Chemistry::Bond*> chemistryBonds_;
QList<Chemistry::Atom*> chemistryAtoms_;
IncidenceMatrix incidenceMatrix_;
то на точке останова не будет уже chemistryBonds_.
То есть получается: кто первым объявлен (первым инициализируется в конструкторе), тот куда-то пропадает.
Немного побегал дебагом. Список портится внутри void Render::Viewer::updateMolecule().
До вызова updateGL() всё отлично, после <internal error>. А это метод (точнее слот) QGLViewer'а.
Мыслей больше нет.