Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
默认类型的C++重载赋值运算符_C++_Operator Overloading_Assignment Operator - Fatal编程技术网

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

默认类型的C++重载赋值运算符,c++,operator-overloading,assignment-operator,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类型定义为int或

我想为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(根据需要),但在调试代码中,我们希望将其作为一个类,用于在数千个位置进行自动类型检查。代码必须是通用的。 原因是,如果将CX设为类,那么编译器(至少是我们使用的版本)无法优化所有操作

一个问题是——我不想让这一切过去:

CX x; long p; p = x;
我假设下面的转换解决方案也会隐式地使长/短etc代码通过。 如果不是,那正是我要找的

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

CX x=一些64位整数

但是允许

CX x=一些32位整数

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

如果您觉得这是一个糟糕的设计,或者我应该尝试其他替代方案,那么我需要的原因是:我们有数千行遗留代码,其中一些代码只是被typedef设置为int

到处都有这样的作业:


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

如果您只想转换为int,则可以向类中添加cast操作符

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

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

你不能这样做。operator=必须是一个成员函数,不能重载int。我看到了以下可能性:

依赖于类中的隐式转换运算符。我建议不要那样做。我记不起有一次我做了这件事,我没有后悔过,后来就把它拿走了。 编写一个显式成员函数int get const{return data;}并调用它。 扪心自问,为什么要在类中封装那个int,但仍然要允许对普通int赋值。这很奇怪。
这正是我读到问题时的想法。因为int不是一个类,所以不能重载它的运算符=-但可以按照建议从“=”符号的另一端解决问题。注意:转换在您需要时开始,但在您不需要时也可能开始。。。在ABC最初是一个typedef到int的代码中,这不应该是一个问题,但从长远来看,这不是一个好的解决方案。@David:正是这个问题。我不希望当有人试图将此类赋给长变量时int cast传递。我想知道这种重构的原因可能是什么。如果基类型转换可以实现,则不考虑模板函数。我怀疑这个模板断言是否有效。IMP的一个限制是-我们不能使用get/set方法,因为::在发布版本中,我们将CX typedef定义为int或long,原因是,如果CX被设置为类,那么至少我们使用的版本的编译器无法优化所有操作。在调试构建中,我们希望将其作为一个类,用于在数千个位置进行自动类型检查。代码必须是通用的。
CX x; int k; k = x;    // Writing the simplified relevant code here
class ABC
{
public:
    operator int() { return data; } // cast operator
private:
    int data;
...
};