c ++如何正确使用带有类模板的复制构造函数

时间:2015-11-17 07:24:48

标签: c++

我不会问这个,但经过大约5个小时的谷歌搜索和挖掘堆栈,教科书和YouTube视频后,我仍然被卡住了。这是我正在使用的代码(是的,它非常糟糕,我只是学习C ++)如果你把它放到底部,你会发现我无法让复制构造函数实际创建另一个SimpleVector类型的对象。最后一行显示了我尝试使用我创建的复制构造函数从mySV创建mySV2的位置,然后通过对新对象使用print函数来证明它发生了。

再次感谢您的帮助,并提出我的新问题。我真的相信反馈是冠军的早餐(而且不那么蹩脚的程序员)所以请大声说出来,并且知道我会永远感激(或者至少在本课程期间)为你提供帮助。

template <class T>
class SimpleVector {
public:
    T* myarray;
    T* temparr;
    //constructors
    SimpleVector() {
        size = 0;
        myarray = NULL;
    }

    SimpleVector(int sz) {
        size = sz;
        myarray = new T[size];
    }

    //**** Copy Constructor ****
    SimpleVector(const SimpleVector& sv) {
        size = sv.size;
        dataType = sv.dataType;
        temparr = new T[size];
        for (int i = 0; i < size; i++) {
            temparr[i] = sv.myarray[i];
        }
        myarray = temparr;
    }

};

int main() {
        int howMany = 5;
        SimpleVector<string> mySV(howMany);
        for (int i = 0; i < howMany; i++) {
            cout << "Enter item " << (i + 1) << ": ";
            cin >> mySV.myarray[i];
        }
    mySV.print();

    template<class T>
    SimpleVector<T> mySV2(mySV);

    mySV2.print();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题。行temparr = new T[size];创建内存泄漏,因为析构函数中未删除temparr。复制构造函数实际上不需要temparr

SimpleVector(const SimpleVector& sv){
    size = sv.size;
    dataType = sv.dataType;
    myarray = new T[size];
    for (int i = 0; i < size; i++) {
        myarray[i] = sv.myarray[i];
    }
}

如果复制基本类型的指针,我还建议使用<utility>标题中的std::copy函数。在处理复制构造函数时,您还应该考虑the rule of three

下一期可在主要内容中找到:

template<class T>
SimpleVector<T> mySV2(mySV);

在这里,您需要指定构造对象的T类型。您的类成员dataType无法指定新创建的对象的类型。你应该把它改成

SimpleVector<std::string> mySV2(mySV);

添加void print()成员函数,成员size_t sizestd::string dataType代码正确执行后。