C ++ - 重载默认类型的赋值运算符

时间:2010-10-29 07:32:28

标签: c++ operator-overloading assignment-operator

我想为“int”,“long”等类型重载赋值运算符。也就是说,我想使用如下代码:

class CX {
private:
  int data;
...
};

CX obj;
int k;
k = obj;  // k should get the value of obj.data

显然,赋值运算符不能成为友元函数。我如何实现上述目标?

我可能会遗漏一些简单的东西,但却无法弄清楚这样做的语法/方法。

另外,一个IMP限制 - 我们不能使用get / set方法,因为:: 在发布代码中,我们将CX typedefed作为int或long(根据需要),但在DEBUG代码中,我们希望将它作为一个类(用于数千个地方的自动类型检查)。代码需要很常见。 原因是如果CX成为一个类,编译器(至少我们使用的版本)在某种程度上无法优化所有操作。


一个问题是 - 我不想让它通过:

CX x; long p; p = x;

我假设下面的转换解决方案将隐式地使长/短等代码也通过。 (如果没有,那么这正是我要找的!)。

在相关的说明中,回答大卫的问题 - 我想重构的原因是 - 我们希望能够将CX切换为32位或64位。因此,我们希望禁止任何隐式转换并在编译时捕获它们。现在,相反 - (disallowiong

CX x = some_64_bit_int;

但允许

CX x = some_32_bit_int;

我通过使用templatized =运算符来实现,该运算符默认情况下在编译时断言,但是将其重载为我想要的类型。


如果您认为这是一个糟糕的设计或者我应该尝试其他替代方案 - 我需要的原因是:我们有数千行遗留代码,其中某些东西只是被输入“int” 。

typedef int CX;

整个地方都有分配,例如:

CX x; int k; k = x;    // Writing the simplified relevant code here

我正在开发一个将CX改为班级的项目。在第一阶段,我们希望修复所有编译错误(使CX成为一个类),尽可能少地修改代码。

3 个答案:

答案 0 :(得分:16)

如果你想要的只是转换为int。

,你可以在你的类中添加一个强制转换操作符
class ABC
{
public:
    operator int() { return data; } // cast operator
private:
    int data;
...
};

答案 1 :(得分:1)

你不能这样做。 operator=()必须是成员函数,不能为int重载。我看到了这些可能性:

  • 依赖于您班级中的隐式转化运算符。我会建议反对。我不记得我曾经做过一次后悔并在以后删除它。
  • 写一个显式的成员函数int get() const {return data;}并调用它。
  • 问问自己为什么要将int包装在一个类中,但仍希望允许赋值为int。闻起来。

答案 2 :(得分:0)

您可以将CX作为一个类,并在类中包含转换函数,类型为int。 这样你的班级就可以这样工作