我想重载“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 类型定义为 int 或 long(根据需要),但在 DEBUG 代码中,我们希望将其作为一个类(用于在数千个位置进行自动类型检查)。代码必须是通用的。原因是,如果 CX 成为一个类,编译器(至少是我们正在使用的版本)在某种程度上无法优化所有操作。


一个问题是 - 我不希望这件事通过:

CX x; long p; p = x;

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

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

CX x = some_64_bit_int;

但允许

CX x = some_32_bit_int;

我通过使用模板化 = 运算符来实现,该运算符默认在编译时断言,但针对我想要的类型重载它。


如果您觉得这是一个糟糕的设计或者我应该尝试其他替代方案 - 我需要的原因是这样的:我们有数千行遗留代码,其中某些内容只是类型定义为“int”。

typedef int CX;

到处都有这样的任务:

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

我正在开展一个将 CX 更改为类的项目。在第一阶段,我们希望修复所有编译错误(使 CX 成为一个类时出现的错误),并对代码进行尽可能少的更改。

有帮助吗?

解决方案

你不可以做这个。 operator=() 必须是成员函数并且不能重载 int. 。我看到了这些可能性:

  • 依赖类中的隐式转换运算符。我建议反对这一点。我不记得我曾在哪里做过这样的事 不是 后来后悔了就删掉了。
  • 编写显式成员函数 int get() const {return data;} 并称之为。
  • 问问自己为什么要包装它 int 在课堂上,但仍然希望允许分配给普通 int. 。那味道。

其他提示

您可以转换运算符,如果你想要的仅仅是转换为INT添加到您的类。

class ABC
{
public:
    operator int() { return data; } // cast operator
private:
    int data;
...
};

可以具有CX作为一类,并且具有在类int类型转换功能。 这样,你的类可以以这种方式工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top