1

我正在使用模板作为实践来实现自己的“向量”类。除了 Copy 构造函数和重载的 = 运算符之外,一切似乎都在工作。我不确定问题到底出在哪里。我将在下面发布整个源代码:(另外我不确定我是否有任何泄漏)

#include <iostream>
#include <string>
using namespace std;

template <typename TT1>
class Vector{
private:
    int size;
    TT1* ptr;
public:
    Vector();
    ~Vector();
    Vector(int size);
    Vector(const Vector& a);
    Vector<TT1>& operator=(const Vector& a);
    void set(int position, TT1 data);
    TT1 get(int position);
    int get_size();
};

//------Default Constructor------
template <typename TT1>
Vector<TT1> :: Vector()
{
    size = 0;
    ptr = NULL;
}

//-------Copy Constructor-------
template <typename TT1>
Vector<TT1> :: Vector(const Vector<TT1>& a)
{
    if(a.ptr != NULL)
    {
        this->size = a.size;
        delete[] ptr;
        ptr = new TT1[size];
        for ( int i = 0; i < this->size; i++)
                this->ptr[i] = a.ptr[i];
    }
}

//------Destructor-------
template <typename TT1>
Vector<TT1> :: ~Vector()
{
    delete[] ptr;
}

//-----Overloaded = operator----
template <typename TT1>
Vector<TT1>& Vector<TT1> :: operator=(const Vector<TT1>& a)
{
    if(this != &a)
    {
        this->size = a.size;
        delete[] this->ptr;
        this->ptr = new TT1[a.size];
        for (unsigned int i = 0; i < this->size; i++)
                this->ptr[i] = a.ptr[i];
        return *this;
    }
}
//----Constructor with size---
template<typename TT1>
Vector<TT1> :: Vector(int size)
{
    this->size = size;
    ptr = new TT1[size];
}

//---- Set data @ Poisition----
template<typename TT1>
void Vector<TT1> :: set(int position, TT1 data)
{
    *(ptr+ position) = data;
}

//----Get data From position----
template<typename TT1>
TT1 Vector<TT1> :: get(int position)
{
    return *(ptr + position);
}

//-----Get size----
template<typename TT1>
int Vector<TT1> :: get_size()
{
    return size;
}

void foo(Vector<string> a)
{

}

int main()
{
    Vector<string> a(3);
    a.set(0, "asd");
    a.set(2, "hjk");
    a.set(1, "34645!");
    for(int i = 0; i < a.get_size(); i++)
    {
        cout << a.get(i) << endl;
    }
    Vector<string> b = a;
    for(int i = 0; i < a.get_size(); i++)
    {
        cout << b.get(i) << endl;
    }
    foo(a);

    return 0;
}

现在错误的部分是:

template <typename TT1>
Vector<TT1> :: Vector(const Vector<TT1>& a)
{
    if(a.ptr != NULL)
    {
        this->size = a.size;
        delete[] ptr;
        ptr = new TT1[size];
        for ( int i = 0; i < this->size; i++)
                this->ptr[i] = a.ptr[i];
    }
}

最后在这里:

//-----Overloaded = operator----
template <typename TT1>
Vector<TT1>& Vector<TT1> :: operator=(const Vector<TT1>& a)
{
    if(this != &a)
    {
        this->size = a.size;
        delete[] this->ptr;
        this->ptr = new TT1[a.size];
        for (unsigned int i = 0; i < this->size; i++)
                this->ptr[i] = a.ptr[i];
        return *this;
    }
4

1 回答 1

1

您删除了一个从未分配过的指针:

//-------Copy Constructor-------
template <typename TT1>
Vector<TT1> :: Vector(const Vector<TT1>& a)
{
    std::cout << "Vector(const Vector<TT1>& a), " << a.size << std::endl;
    if(a.ptr != NULL)
    {
        this->size = a.size;
        delete[] ptr;  //<-------------- no corresponding new
        ptr = new TT1[size];
        for ( int i = 0; i < this->size; i++)
                this->ptr[i] = a.ptr[i];
    }
}

只需将其注释掉,它就可以正常工作

编辑:根据 Mike Seymour 的观察,成员尤其是。ptr应该初始化:

Vector<TT1> :: Vector(const Vector<TT1>& a) : size(0), ptr(NULL)
{
...
}

此外,尽管编译器显然接受它作为 constructor/operator=,但如果您编写格式为

Vector(const Vector& a);
Vector<TT1>& operator=(const Vector& a);

相反,为了一致性和良好的风格恕我直言包括模板参数:

Vector(const Vector<TT1>& a);
Vector<TT1>& operator=(const Vector<TT1>& a);

在定义中也是如此。

于 2013-05-25T16:50:01.437 回答