EDIT: я в основном переделал весь вопрос, чтобы предоставить исполняемый пример...
Я получаю ошибку сегментации, которую я не могу понять. Вот сжатая версия моего кода. Я сохранил исходную иерархию классов, хотя у некоторых классов нет соответствующих методов, поскольку я думаю, что это как-то связано с моей проблемой, особенно после некоторых комментариев, которые я получил.
#import <vector>
using namespace std;
template<class Data = float>
class Vector
{
// All pure virtual functions.
};
template<class Data>
class TranslationVector : public virtual Vector<Data>
{
// All pure virtual functions.
};
template<class Data>
class SimpleVector4 : public virtual Vector<Data>
{
public:
SimpleVector4(const Data d0, const Data d1, const Data d2, const Data d3)
{
fData = new vector<Data> ;
fData->push_back(d0);
fData->push_back(d1);
fData->push_back(d2);
fData->push_back(d3);
}
vector<Data>*
getData()
{
return (fData);
}
private:
vector<Data>* fData;
};
template<class Data>
class SimpleTranslationVector4 : public SimpleVector4<Data> , public TranslationVector<Data>
{
public:
SimpleTranslationVector4(const Data x, const Data y, const Data z, const Data w) :
SimpleVector4<Data> (x, y, z, w)
{
}
};
template<class Data = float>
class Matrix
{
// All pure virtual functions.
};
template<class Data>
class TransformationMatrix : public virtual Matrix<Data>
{
// All pure virtual functions.
virtual void
translate(TranslationVector<Data>* const translation) = 0;
};
template<class Data>
class SimpleMatrix44 : public virtual Matrix<Data>
{
public:
SimpleMatrix44()
{
fData = new vector<Data> (CELLS_IN_MATRIX, 0);
setIdentity();
}
vector<Data>*
getData()
{
return (fData);
}
void
setIdentity()
{
fData->at(0) = 1;
fData->at(1) = 0;
fData->at(2) = 0;
fData->at(3) = 0;
fData->at(4) = 0;
fData->at(5) = 1;
fData->at(6) = 0;
fData->at(7) = 0;
fData->at(8) = 0;
fData->at(9) = 0;
fData->at(10) = 1;
fData->at(11) = 0;
fData->at(12) = 0;
fData->at(13) = 0;
fData->at(14) = 0;
fData->at(15) = 1;
}
private:
static const int CELLS_IN_MATRIX = 16;
vector<Data>* fData;
};
template<class Data>
class SimpleTransformationMatrix44 : public SimpleMatrix44<Data> , public TransformationMatrix<Data>
{
public:
SimpleTransformationMatrix44() :
SimpleMatrix44<Data> ()
{
}
void
translate(TranslationVector<Data>* translation)
{
vector<Data> *data = SimpleMatrix44<Data>::getData();
vector<Data> *transData = ((SimpleVector4<Data>*) translation)->getData();
// The error occurs on this line:
data->at(12) += data->at(0) * transData->at(0) + data->at(4) * transData->at(1) + data->at(8) * transData->at(2);
data->at(13) += data->at(1) * transData->at(0) + data->at(5) * transData->at(1) + data->at(9) * transData->at(2);
data->at(14) += data->at(2) * transData->at(0) + data->at(6) * transData->at(1) + data->at(10) * transData->at(2);
data->at(15) += data->at(3) * transData->at(0) + data->at(7) * transData->at(1) + data->at(11) * transData->at(2);
}
};
int
main(int argc, char** argv)
{
SimpleTransformationMatrix44<float> matrix1;
matrix1.translate(new SimpleTranslationVector4<float> (0.0f, 10.0f, 0.0f, 1.0f));
return 0;
}
Я прокомментировал код, где возникает ошибка. Из отладки я вижу, что это действительно происходит в функции size()
vector
и что transData
не инициализирован. Я не могу понять, почему transData
не был инициализирован! Любые идеи?
Спасибо,
Газ.
transData
получается? Например. как определяетсяSimpleVector4<Data>::getData()
. КакTranslationVector<Data>
относится кSimpleVector4<Data>
. Почему вы отбрасываете const. Как определяетсяSimpleTranslationVector4<float>
. И т. д. - person Sander De Dycker   schedule 08.07.2011(SimpleVector4<Data>*) translation
почему это типизация? - person iammilind   schedule 08.07.2011vector
s в куче избыточно. - person n. 1.8e9-where's-my-share m.   schedule 08.07.2011vector
под капотом — это просто указатель и длина. Указанный массив размещается в куче. Одного выделения достаточно. Если ваш вектор имеет фиксированную длину, вам даже не нужна куча,boost::array
будет работать так же хорошо, как и массив C-стиля (но последний не так хорош). - person n. 1.8e9-where's-my-share m.   schedule 08.07.2011