Непонятная ошибка сегментации - PullRequest
1 голос
/ 08 июля 2011

РЕДАКТИРОВАТЬ: Я в основном изменил весь вопрос, чтобы я мог предоставить исполняемый пример ...

Я получил ошибку сегментации, которую я не могу понятьВот сжатая версия моего кода.Я сохранил исходную иерархию классов, хотя некоторые классы не имеют соответствующих методов, так как я думаю, что это как-то связано с моей проблемой, особенно после некоторых комментариев, которые я получаю.Я прокомментировал в коде, где происходит ошибка.Из отладки я вижу, что на самом деле это происходит в функции size() vector и что transData не был инициализирован.Я не могу понять, почему transData не был инициализирован!Есть идеи?

Спасибо,

Газ.

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Представляется, что приведение не наследуемых классов является вашей ошибкой.

Давайте посмотрим ваш код. Существует преобразование SimpleTranslationVector4<float>* в TranslationVector<float>* при вызове функции перевода. Затем преобразованное значение снова конвертируется в SimpleVector4<float>*. Но SimpleVector4<float> не наследует TranslationVector<float>.

Этот код также приводит к ошибке.

template<class Data>
class SimpleVector4 {
public:
    int a;
};

template<class Data>
class TranslationVector {
};

template<class Data>
class SimpleTranslationVector4 : public SimpleVector4<Data>,
public TranslationVector<Data> {
};

int main() {
    SimpleTranslationVector4<float> A;
    SimpleVector4<float>* b = (SimpleVector4<float>*)&A;
    TranslationVector<float>* c = (TranslationVector<float>*)&A;
    SimpleVector4<float>* d = (SimpleVector4<float>*)c;
    b->a = 1; // ok
    d->a = 1; // error
}
1 голос
/ 08 июля 2011

Вы делаете приведение в стиле C между несвязанными типами. Это не безопасно. Тот факт, что вам нужно сделать это, вероятно, указывает на проблему в вашем дизайне, но попробуйте заменить это:

vector<Data>* transData = ((SimpleVector4<Data>*) translation)->SimpleVector4<Data>::getData();

с этим:

vector<Data>* transData = dynamic_cast<SimpleVector4<Data>*>(translation)->getData();

...