为了教育目的,我今天早些时候编写了一个包装类,如下所示(这是从一本书中摘录的):
#ifndef WRAPPER_H
#define WRAPPER_H
template<class T>
class Wrapper
{
public:
Wrapper()
{ dataPtr = 0; }
Wrapper(const T& inner)
{
dataPtr = inner.clone();
}
Wrapper(const Wrapper<T> &original)
{
if (original.dataPtr != 0)
dataPtr = original.dataPtr->clone();
else
dataPtr = 0;
}
Wrapper &operator =(const Wrapper<T> &original)
{
if (this != &original)
{
if (dataPtr != 0)
delete dataPtr;
dataPtr = (original.dataPtr !=0) ? original.dataPtr->clone() : 0;
}
return *this;
}
~Wrapper()
{
if (dataPtr != 0)
delete dataPtr;
}
T &operator*()
{
return *dataPtr;
}
const T&operator*() const
{
return *dataPtr;
}
T *operator->()
{
return dataPtr;
}
const T * const operator->() const
{
return dataPtr;
}
private:
T *dataPtr;
};
#endif
主要思想是充当指针,并具有处理内存管理、复制构造函数、析构函数和赋值运算符的额外优势。它包装了具有克隆方法的类:它们返回指向自己的副本的指针(而不是指向自己,而是使用"new" "Class(*this)"创造新的副本)。
在某些方面,它似乎像一个"unique_ptr",因为封装的对象只能通过此包装器访问。然而,有一个区别,这就是我的问题所在。在这个包装类中,定义了一个构造函数,接受包装类引用对象的引用(上面代码中的第一个构造函数)。
这非常方便。假设我们有类"A"和类"B",并且类"B"的构造函数需要引用"Wrapper< A >"。那么我可以使用另一个类"A"来构造一个对象"B"。
A object1;
B object2(A);
这是因为使用
object2
构造了一个Wrapper< A >
(然后将其传递给B
的构造函数),使用了前面提到的Wrapper
构造函数。在
std::memory
中的智能指针中是否有任何一种可以实现这个目标?我的主要目标是教育,但在实践中我不想重复造轮子。
nullptr
而不是0
。 - Jesper Juhl