2013-09-22 2 views
-1

Это неловко, но я немного ржавый на своем C++ и для жизни меня не вижу, почему этот код вызывает ошибку сегментации. Странно, что несколько итераций назад, казалось, работали нормально. Я даже не знаю, что я делаю по-другому.Почему этот простой конструктор вызывает сегрегацию?

Это в основном конструктор для объекта класса шаблона, предназначенный для хранения трех объектов. Я получаю ошибку сегм на первой линии реализации конструктора (где я Назначьте к х *):

VecXd.hpp:

#ifndef JF_VecXd 
#define JF_VecXd 

#include <iostream> 

template <class T> 
class VecXd{ 
    public: 
     VecXd(T a, T b, T c); 

     VecXd(const VecXd & vector); 

     T getElement(int n)const; 
     void setElements(T a, T b, T c); 
     void display(); 
     void VecXd<T>::clearElements(); 
     VecXd<T>& VecXd<T>::operator=(const VecXd& vector); 

/* 
     VecXd& VecXd::operator<<(const VecXd & vector); 
     VecXd& VecXd::operator>>(const VecXd & vector); 
     VecXd& VecXd::operator+(const VecXd & vector); 
     VecXd& VecXd::operator+=(const VecXd & vector); 

     ~VecXd(); 
*/    

     private: 
      T * x, T * y, T * z; 

}; 

template <class T> 
VecXd<T>::VecXd(T a, T b, T c){ 
    x = new T(a); 
    y = new T(b); 
    z = new T(c); 
} 
//CVector& CVector::operator= (const CVector& param) 


template <class T> 
VecXd<T>::VecXd(const VecXd & vector){ 
    x = new T(vector.getElement(0)); 
    y = new T(vector.getElement(1)); 
    z = new T(vector.getElement(2)); 
} 

template <class T> 
VecXd<T>& VecXd<T>::operator=(const VecXd& vector){ 
    if(this != &vector){ 
     *x = vector.getElement(0); 
     *y = vector.getElement(1); 
     *z = vector.getElement(2); 
    } 
    return *this; 
} 

template <class T> 
T VecXd<T>::getElement(int n) const{ 
    n = n%3; 
    T result; 
    switch(n){ 
     case 0: 
      result = *x; 
      break; 
     case 1: 
      result = *y; 
      break; 
     case 2: 
      result = *z; 
      break; 
    }  
    return result;  
} 

template <class T> 
void VecXd<T>::clearElements(){ 
    delete x; 
    delete y; 
    delete z;  
} 

template <class T> 
void VecXd<T>::setElements(T a, T b, T c){ 
    clearElements(); 
    *x = a; 
    *y = b; 
    *z = c;  
} 

template <class T> 
void VecXd<T>::display(){ 
    std::cout << "x: " << x << "\n"; 
    std::cout << "y: " << y << "\n"; 
    std::cout << "z: " << z << "\n\n\n"; 
} 

#endif 

test.cpp:

#include "vecxd.hpp" 
#include <iostream> 

int main(){ 
    std::cout << "Creating vector 1..." << std::endl; 
    VecXd<int> v1(1,2,3); 
    std::cout << "Vector 1:" << std::endl; 
    v1.display(); 

    std::cout << "Vector 2 (copy-constructed from v1):" << std::endl; 
    VecXd<int> v2(v1); 
    v2.display(); 

    std::cout << "V1 set to 3,4,5:" << std::endl; 
    v1.setElements(3,4,5); 
    v1.display(); 

    std::cout << "V2 = V1, display V2" << std::endl; 
// v2 = v1; 
    v2.display(); 


    system("pause"); 

    return 0; 
} 

Я пробовал несколько вариантов на этом в том числе

x* = a;

x = new(a);

И я пытался с функцией работы следующим образом:

VecXd(T & a, T & b, T & c);

Но тогда он не позволил бы мне назвать это с помощью:

VecXd<int>(1,2,3);

Спасибо очень для вашего времени, это очень ценится!

+2

Этот код не скомпилирован в первую очередь, так что, очевидно, он также не может быть segfault. Пожалуйста, покажите нам реальный код. – syam

+0

'new' возвращает указатель, и * x запрашивает значение, с одной стороны. Можете ли вы просто использовать 'x = new T (a)'? – BrainSteel

+0

Почему вы пытаетесь присвоить объект указателю с ссылкой? – OldProgrammer

ответ

2

Вы разыменовываете переменные-члены перед назначением. Непосредственно присвоить новые указатели на них:

template <class T> 
VecXd<T>::VecXd(T a, T b, T c){ 
    x = new T(a); 
    y = new T(b); 
    z = new T(c); 
} 

Конечно, вы собираетесь просочиться эту память, если у вас нет деструкторов, а также.

+1

Большое спасибо! В следующий раз я выложу полный код. Я наивно думал, что я вежлив, пытаясь сначала изолировать проблему; Я не понимал, что это затрудняет решение. Еще раз спасибо. – SemperCallide

+1

Добро пожаловать! Это здорово сократить код до минимума, чтобы воспроизвести, но по крайней мере, если фрагмент фактического кода используется, вырезать и вставить его из оригинала, чтобы уменьшить ошибки ввода. –

Смежные вопросы