带有非类型参数的C ++模板类:如何重载assign运算符?

时间:2017-10-18 02:19:38

标签: c++ templates

我正在编写一个带有非类型参数的模板类

class Test
{   
public:
    Test() { std::cout << "Test::Test()" << std::endl; }

    Test(Test const&) { std::cout << "Test::Test(Test const&)" << std::endl; }

     ~Test() { std::cout << "Test::~Test()" << std::endl; }

     Test& operator=(Test const&)
     {
           std::cout << "Test& Test::operator=(Test const&)" << std::endl;
           return *this;
     }

     void print() const { std::cout << "Test::print() const" << std::endl; }
     void print() { std::cout << "Test::print()" << std::endl; }
};

以上是我的测试&#34;用于测试我的模板类和

的类
template <typename T, unsigned int n>
class Array
{
private:
    T* value;
public:
    Array() {
        this->value = new T[n];
    }

    ~Array() {
        delete[] this->value;
    }

    Array* operator=(const Array* arr)
    {
        this->value = arr->value;
        return this->value;
    }

    T& operator[](int a) {
        return this->value[a];
    }

    unsigned int size()
    {
        return n;
    }
};

上面是我的模板类,带有非类型参数。

int main(int, char*[])
{
 /*first*/   Array<Test, 3> arr_1;

 /*second*/  Array<Test, 3> arr_3 = arr_1;

 return 0;
}

在我的main.cpp文件中,

我用第一个做了类测试对象3次,

我希望重载assign运算符来执行第二个操作。

我试过

Array* operator=(const Array* arr)
{
    this->value = arr->value;
    return this->value;
}

但是它的段落错误&#39;在无限地调用析构函数之后。

我想知道如何在这种情况下编写赋值运算符重载。

谢谢!

1 个答案:

答案 0 :(得分:1)

要实现副本,您需要这样的内容:

// Copy constructor. When you write Array b = a, the compiler actually calls this, not operator=
Array( const Array& src )
{
    this->value = new T[ n ];
    std::copy_n( src.value, n, value );
}
Array& operator=( const Array& src )
{
    // No need for new[], operator= is called after the object is already constructed.
    std::copy_n( src.value, n, value );
    return *this;
}

但是,你不应该重新发明轮子。 C ++标准库中已经有了不错的模板类。如果您的阵列很小(例如3),请使用std::array<Test, 3>。如果您的阵列很大并且您希望将它们从堆栈中移除,则可以使用std::unique_ptr<std::array<Test, 3>>std::vector<Test>