Почему этот очень простой конструктор вызывает ошибку сегмента?

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

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

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);

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

-1

Решение

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]