C++ C++;模板类,如何为特定情况声明副本构造函数?
你好(英语不是我的第一语言,即使我犯了错误也请理解我!谢谢!!) 我正在编写一个可以包含指针的模板类C++ C++;模板类,如何为特定情况声明副本构造函数?,c++,templates,C++,Templates,你好(英语不是我的第一语言,即使我犯了错误也请理解我!谢谢!!) 我正在编写一个可以包含指针的模板类 template <typename T> class SmartPtr { private: T value; public: SmartPtr() {}; ~SmartPtr() {}; SmartPtr(T* a) { this->value = *a; } SmartPtr(S
template <typename T>
class SmartPtr {
private:
T value;
public:
SmartPtr() {};
~SmartPtr() {};
SmartPtr(T* a)
{
this->value = *a;
}
SmartPtr(SmartPtr* a)
{
this->value = a->get_Value();
}
SmartPtr(SmartPtr const* a)
{
this->value = a->get_Value();
}
T get_Value()const{
return this->value;
}
};
但我想得到的结果是
Test::Test()
Test::~Test()
在这种情况下,是否需要编写特定的模板类副本构造函数
非常感谢你的耐心 原因是SmartPtr内部存在
值
成员变量:
template <typename T>
class SmartPtr {
private:
T value; // here T is of class Test
... other stuff ...
}
模板
类SmartPtr{
私人:
T value;//这里T是类Test
…其他东西。。。
}
申报时
SmartPtr<Test> ptr_t1 = SmartPtr<Test>(new Test);
SmartPtr ptr_t1=SmartPtr(新测试);
ptr_t1
是构造的,因此它的值是构造的。这是第一个Test()
构造函数调用。
第二个构造函数是新测试(显然)。
然后,构建SmartPtr
,在this->value=*a
调用Test()
赋值运算符
最后,SmartPtr(新测试)
对象被析构函数,调用内部值
对象上的析构函数
另请注意,由于调用了新测试
,但没有删除
,因此也存在内存泄漏。原因是SmartPtr内部存在值
成员变量:
template <typename T>
class SmartPtr {
private:
T value; // here T is of class Test
... other stuff ...
}
模板
类SmartPtr{
私人:
T value;//这里T是类Test
…其他东西。。。
}
申报时
SmartPtr<Test> ptr_t1 = SmartPtr<Test>(new Test);
SmartPtr ptr_t1=SmartPtr(新测试);
ptr_t1
是构造的,因此它的值是构造的。这是第一个Test()
构造函数调用。
第二个构造函数是新测试(显然)。
然后,构建SmartPtr
,在this->value=*a
调用Test()
赋值运算符
最后,SmartPtr(新测试)
对象被析构函数,调用内部值
对象上的析构函数
另请注意,由于调用了新测试
,但没有删除
,因此也存在内存泄漏。为了只调用构造函数和析构函数,只需直接调用构造函数:
SmartPtr ptr_t1(新测试)
此外,SmartPtr类应该存储指针而不是值。该值可以驻留在通过调用new分配的内存中。而不是:
私人:T值
写:
私人:T*值
这将确保构造函数不会复制该值,而只是指向该值。该值仍将驻留在new分配的内存中。为了只调用构造函数和析构函数,只需直接调用构造函数:
SmartPtr ptr_t1(新测试)
此外,SmartPtr类应该存储指针而不是值。该值可以驻留在通过调用new分配的内存中。而不是:
私人:T值
写:
私人:T*值
这将确保构造函数不会复制该值,而只是指向该值。该值仍将驻留在new分配的内存中。查看此问题,但不确定是否直接复制:this->value=*a代码>是作业…@StoryTeller感谢您的评论。对不起,用C++已经10天了,我还缺少知识。我不应该做作业?SmartPtr
没有指针;它保存类型为Test
的对象。封装指针的类将保存T*ptr代码>,而不是T值代码>@peteBecker谢谢你的评论!我从那开始!看到这个问题,不太确定是否直接复制:this->value=*a代码>是作业…@StoryTeller感谢您的评论。对不起,用C++已经10天了,我还缺少知识。我不应该做作业?SmartPtr
没有指针;它保存类型为Test
的对象。封装指针的类将保存T*ptr代码>,而不是T值代码>@peteBecker谢谢你的评论!我从那开始!最后一个问题,那么“value”成员应该是T*value而不是T value?是的,SmartPtr的析构函数应该是“delete value”,谢谢您的时间。祝您有个美好的一天!最后一个问题,那么“value”成员应该是T*value而不是T value?是的,SmartPtr的析构函数应该是“delete value”,谢谢您的时间。祝您有个美好的一天!