【问题标题】:C++ - overloading assignment operator for default typesC++ - 为默认类型重载赋值运算符
【发布时间】:2011-05-02 06:47:12
【问题描述】:

我想为“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 位。因此,我们希望禁止任何隐式转换并在编译时捕获它们。现在,反过来 - (disallowiong

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 成为一个类)。

【问题讨论】:

  • 我想知道这种重构的原因可能是什么。

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


【解决方案1】:

如果您只想转换为 int,则可以在类中添加强制转换运算符。

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

【讨论】:

  • 正是我在阅读问题时的想法。由于 int 不是一个类,因此您不能重载它 operator=() - 但您可以按照您的建议“从 '=' 符号的另一侧”解决问题。
  • 当心:转换会在你想要的时候开始,但它们也可能在你不希望的时候开始......这在ABC最初是typedef的代码中应该不是问题到 int 但从长远来看这不是一个好的解决方案。
  • @David:正是问题所在。当有人试图将此类添加到“长”变量时,我不希望 int() 强制转换通过。
【解决方案2】:

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

  • 依赖类中的隐式转换运算符。我建议不要这样做。我不记得有一次我做过这件事,我没有后悔过,后来又把它删除了。
  • 编写显式成员函数int get() const {return data;} 并调用它。
  • 问问自己为什么要将int 包装在一个类中,但仍希望允许分配给纯int。那闻起来

【讨论】:

  • 一个 IMP 限制是 - 我们不能使用 get/set 方法,因为 :: 在发布版本中,我们将 CX 类型定义为 int 或 long(根据需要),原因是编译器(至少我们的版本如果将 CX 设为一个类,则无法优化所有操作。在 DEBUG 构建中,我们希望将其作为一个类(用于在数千个地方进行自动类型检查)。代码需要通用。
【解决方案3】:

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

【讨论】:

  • 如果可以进行基本类型转换,则不考虑模板函数。我怀疑这个模板断言会起作用。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2017-10-07
相关资源
最近更新 更多