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”,谢谢您的时间。祝您有个美好的一天!