我正在编写一个带有非类型参数的模板类
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;在无限地调用析构函数之后。
我想知道如何在这种情况下编写赋值运算符重载。
谢谢!
答案 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>