为什么这个非常简单的构造函数会导致seg故障? 这很尴尬,但是我对C++有点生疏,我的生活我看不出为什么这个代码会造成分割错误。奇怪的是,在几次迭代之前,它似乎工作得很好。我甚至不知道我现在做的有什么不同

为什么这个非常简单的构造函数会导致seg故障? 这很尴尬,但是我对C++有点生疏,我的生活我看不出为什么这个代码会造成分割错误。奇怪的是,在几次迭代之前,它似乎工作得很好。我甚至不知道我现在做的有什么不同,c++,constructor,segmentation-fault,template-classes,C++,Constructor,Segmentation Fault,Template Classes,它基本上是一个模板类对象的构造函数,用于保存其中三个对象。在构造函数实现的第一行,我得到了一个seg错误,我将a分配给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 &am

它基本上是一个模板类对象的构造函数,用于保存其中三个对象。在构造函数实现的第一行,我得到了一个seg错误,我将a分配给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=新A

我试着让函数像这样工作:

VecXdT&a、T&b、T&c

但它不会让我用以下方式来称呼它:

VecXd1,2,3


非常感谢您抽出时间,非常感谢

您正在分配前取消对成员变量的引用。直接将新指针分配给它们:

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

当然,除非你也有析构函数,否则你会泄漏内存。

这段代码一开始不是编译的,所以显然它也不会出错。请给我们看真正的代码。new返回一个指针,*x要求一个值,原因之一。你能用x=new Ta吗?为什么你要把一个对象分配给一个取消引用的指针?这甚至是不可编译的。T*x,T*y,T*z;这不是一项法律声明。请把真实的密码贴出来。即使你解决了这个问题,*x=新Ta;取消引用x中的任何不确定值,它是非斜体的,并尝试在其中存储分配返回地址。非常感谢!下次我会发布完整的代码。我天真地认为我是出于礼貌,试图首先孤立问题;我没有意识到这让问题更难解决。再次感谢。