我想知道是否有一种方法可以实现复制构造函数和赋值运算符,以便在为类重新定义它们时只需要进行少量修改。
例如,考虑这样一个类:
class Foo {
private:
int* mInt_ptr;
/* many other member variables
of different types that aren't
pointers */
public:
Foo();
Foo(const Foo&);
Foo& operator=(const Foo&);
~Foo();
};
现在,为了处理指针 mInt_ptr
,我需要在复制构造函数和赋值运算符中适本地处理它。但是,其余的成员变量可以安全地进行浅拷贝。有没有办法自动执行此操作?
一旦一个类变大,显式写出复制非指针成员变量的操作可能会变得乏味和笨拙,所以我想知道是否有一种方法可以编写复制构造函数,例如:
Foo::Foo(const Foo& tocopy)
{
mInt_ptr = new int(*tocopy.mInt_ptr);
/* Do shallow copy here somehow? */
}
而不是以下的显式形式:
Foo::Foo(const Foo& tocopy)
{
mInt_ptr = new int(*tocopy.mInt_ptr);
mVar1 = tocopy.mVar1;
mVar2 = tocopy.mVar2;
...
...
mVarN = tocopy.mVarN;
}
最佳答案
通常,不要使用原始指针,这正是您现在正在与之抗争的原因。相反,使用合适的智能指针,并使用复制交换赋值:
class Foo
{
int a;
Zip z;
std::string name;
value_ptr<Bar> p;
public:
Foo(Foo const &) = default;
Foo & operator=(Foo rhs)
{
rhs.swap(*this);
return *this;
}
void swap(Foo & rhs)
{
using std::swap;
swap(a, rhs.a);
swap(z, rhs.z);
swap(name, rhs.name);
swap(p, rhs.p);
}
};
namespace std { template <> void swap<Foo>(Foo & a, Foo & b) { a.swap(b); } }
value_ptr
可以是 full-blown implementation ,或者像这样简单的东西:
template <typename T> // suitable for small children,
class value_ptr // but not polymorphic base classes.
{
T * ptr;
public:
constexpr value_ptr() : ptr(nullptr) { }
value_ptr(T * p) noexcept : ptr(p) { }
value_ptr(value_ptr const & rhs) : ptr(::new T(*rhs.ptr)) { }
~value_ptr() { delete ptr; }
value_ptr & operator=(value_ptr rhs) { rhs.swap(*this); return *this; }
void swap(value_ptr & rhs) { std::swap(ptr, rhs.ptr); }
T & operator*() { return *ptr; }
T * operator->() { return ptr; }
};
关于c++ - 仅手动定义部分复制构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12286340/