【发布时间】:2010-02-05 21:01:14
【问题描述】:
我想为我的类(我们称之为 A)实现一个 Swap() 方法来生成复制和交换运算符 =()。据我所知,swap方法应该是通过交换类的所有成员来实现的,例如:
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;
};
但是,如果我有一个 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;
};
并调用此代码:
A a;
FILE* f = fopen(...);
a.Deserialize(f);
我很抱歉措辞如此含糊。
【问题讨论】:
-
请帮帮我。如果类中有 const 成员,operator=() 会做什么?我的意思是什么目的?
-
如果我们了解更大的背景可能会有所帮助。你真正想要达到的目标是什么?
class A真的是什么? -
@John (+1) @Neil 如果内存地址 1 表示的人 A (acct-id const) 的对象将被内存表示的人 B (acct-id const) 交换地址 2. 然后我认为交换对象没有什么害处——包括 acct-id ......交换是为了......(等待它......)交换!这并不意味着更改值... C++ 的 const 正确性适用于一组相当有限的用例。
-
@f0b0s:好的,很公平。但你不会把那个人换成另一个人。关键是当你有一个带有 const 成员变量的类和一个 swap 方法时,有些事情是不对的。成员不应该是 const 或者你不应该交换。一般来说。
-
您的代码似乎仍然缺少一些东西。而且我仍然看不出你为什么要构建一个临时的并交换它。 (至少,你确定你想要一个公共交换方法。也许你只是想要一个私人助手,它只会交换你想要交换的东西?)