我想为我的类实现一个Swap()方法(让我们称之为A)来创建copy-and-swap operator =().据我所知,交换方法应该通过交换类的所有成员来实现,例如:
class A
{
public:
void swap(A& rhv)
{
std::swap(x, rhv.x);
std::swap(y, rhv.y);
std::swap(z, rhv.z);
}
private:
int x,y,z;
};
Run Code Online (Sandbox Code Playgroud)
但如果我有一个const成员,我该怎么办?我不能为它调用std :: swap,所以我不能编码A :: Swap().
编辑:其实我的课程有点复杂.我想序列化和反序列化它.Const成员是一个不会在此对象中更改(例如其ID)的数据.所以我想写一些类似的东西:
class A
{
public:
void Serialize(FILE* file) const
{
fwrite(&read_a, 1, sizeof(read_a), file);
}
void Deserialize(FILE* file) const
{
size_t read_a;
fread(&read_a, 1, sizeof(read_a), file);
A tmp(read_a);
this->Swap(tmp);
}
private:
const size_t a;
};
Run Code Online (Sandbox Code Playgroud)
并调用此代码:
A a;
FILE* f = fopen(...);
a.Deserialize(f);
Run Code Online (Sandbox Code Playgroud)
对于这种模糊的措辞,我很抱歉.
我认为你真正想要的是拥有一个可以在对象之间轻松交换的内部数据结构.例如:
class A
{
private:
struct A_Data {
int x;
int y;
const int z;
A_Data(int initial_z) : z(initial_z) {}
};
std::auto_ptr<A_Data> p_data;
public:
A(int initial_z) : p_data(new A_Data(initial_z)) {}
void swap(A& rhv) {
std::swap(p_data, rhv.p_data);
}
};
Run Code Online (Sandbox Code Playgroud)
这使z值在A对象内部数据的任何实例中保持不变,但您可以交换两个A对象的内部数据(包括常z量值)而不违反const-correctness.