我正在写一个带有非类型参数的模板类
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; }
};
上面是我的“测试”类,用于测试我的模板类和
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;
}
但是在无限次调用析构函数之后,它会“出现段错误”。
我想知道在这种情况下如何编写assign运算符重载。
谢谢!
最佳答案
要实现复制,您需要这样的东西:
// 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>
关于c++ - 具有非类型参数的C++模板类:如何重载Assign运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46801864/