0

如果我有课

template <typename T>
struct C {
...

private:
  auto_ptr<T> ptr;
};

如何为 C 定义复制构造函数:

它不可能是

template <typename T>
C<T>::C(const C& other) 

因为我想如果我从其他人那里复制 auto_ptr,我已经通过删除所有权更改了其他人。将复制构造函数定义为是否合法

template <typename T>
C<T>::C(C& other) {}
4

3 回答 3

1

如果您想防止所有权转移和/或复制,您可以定义复制构造函数和赋值运算符private,从而禁止您的类的用户复制或分配您的对象。

于 2010-06-21T20:07:32.797 回答
1

你真的想复制你班级的状态还是转移它?如果你想复制它,那么你就像任何其他带有指针的类一样:

template < typename T >
C<T>::C(C const& other) : ptr(new T(*other.ptr)) {} // or maybe other.ptr->clone()

如果您真的想转移指针的所有权,您可以使用非常量“复制”构造函数来完成,但我建议您在调用站点做一些更明显的事情;告诉阅读代码的人所有权已经转移的东西。

于 2010-06-21T20:09:57.107 回答
0

There's no such thing as a "standard" copy constructor, but people do expect them to behave a certain way. If your object is going to do any transferring of ownership on copy, then it's a bad idea to make a copy constructor that obscures this fact. A better approach would be to create a method that makes this clear. (You could call it CloneAndTransfer or something similar.)

于 2010-06-21T20:19:05.920 回答