【问题标题】:Overloading assignment operator for pointers to two different classes为指向两个不同类的指针重载赋值运算符
【发布时间】:2013-02-03 14:01:45
【问题描述】:

我的问题: 我正在尝试为指向两个不同类的指针重载赋值运算符。这是一个例子:

dc.h:

#ifndef DC_H_
#define DC_H_

#include "ic.h"

class dc {

double d;
char c;

public:

dc(): d(0), c(0) { }

dc(double d_, char c_): d(d_), c(c_) { }

dc* operator=(const ic* rhs);

~dc() { }

};

#endif /* DC_H_ */

类 ic.h:

#ifndef IC_H_
#define IC_H_

class ic {

int i;
char c;

public:

ic(): i(0), c(0) { }

ic(int i_, char c_): i(i_), c(c_) { }

~ic() { }

};

#endif /* IC_H_ */

dc.cpp:

#include "dc.h"

dc* dc::operator=(const ic* rhs) {
d = rhs->i;
c = rhs->c;  
return this;
}

ic.cpp:

#include "ic.h"

main.cpp:

#include "dc.h"
#include "ic.h"

#include<iostream>

int main() {

dc DC;
ic IC;

dc* dcptr = &DC;
ic* icptr = &IC;

dcptr = icptr;

return 0;
}

我收到以下错误消息:

错误:无法在赋值中将 'ic*' 转换为 'dc*'

如果我用引用而不是指针来做这一切,这一切都会奏效。不幸的是,因为我想使用指向 ic 和 dc 的指针作为另一个类中的成员,所以我不能使用引用,因为必须初始化作为成员的引用,并且一旦初始化它们就不能更改为引用另一个对象。我希望能够使用 ic 和 dc 进行算术运算,例如:

dc *d1, *d2, *d3;
ic *i1, *i2, *i3;
*d1 = (*d1)*(*i1) + (*i2)*(*d2) - (*d3)*(*i3);

但是,我希望我的代码看起来不错,并且不想到处都有(*)*(*)。取而代之的是这样的:

d1 = d1*i1 + i2*d2 - d3*i3;

这就是我想这样做的原因。请让我知道这是否可能。对我来说,编译器似乎想要调用指向指针赋值的默认指针而不是重载的指针。

提前感谢您的帮助!

【问题讨论】:

  • 您使用指针的推理是有缺陷的。正如您不使用参考文献的理由一样。您将通过使用参考来实现您正在尝试的目标。
  • 您不能为内置类型重载运算符。
  • 您好 Drew,感谢您的快速回复。所以你说可以使用引用作为成员吗?我正在使用的书对引用进行了以下说明: 1. 引用必须在创建时进行初始化。 (可以随时初始化指针。) 2. 一个对象的引用一旦被初始化,就不能更改为引用另一个对象。 (指针可以随时指向另一个对象。) 3. 不能有 NULL 引用。您必须始终能够假定引用连接到合法的存储。如果你知道一个 wrk arnd。你能请我去sw!发送!
  • 嗨,Kerrek,感谢您的快速回复。我正在尝试为 ic 和 dc 重载 = 运算符,这些是我创建的类。你有什么其他的建议?谢谢!
  • 在我的第一条评论中我的意思是:所以你说可以使用引用作为成员而不初始化或初始化一些垃圾然后改变它?谢谢!

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


【解决方案1】:

您不能为指针重载运算符。

如果您想坚持使用运算符重载,一个选择是创建一个指针包装对象,一个包含指向该对象的指针的对象 - 本质上是一个智能指针,并重载该对象的运算符。

【讨论】:

  • 您好 Karthik,感谢您的回答。这是个好主意!会试一试。但是有一个问题:如果我重载 = operator 让我们这样说: ic* operator=(ic* i) { 将数据从 i 复制到左侧;这确实有效。因此,您可以重载指针的赋值运算符。对我来说,问题似乎在于 lhs 和 rhs 不是同一类型。 (不幸的是,我还不能投票 b/c 我没有足够的代表。)
  • 嗨!因此,我已经在我正在从事的项目中实施了您的答案,并且效果很好!我希望有足够声誉的人出现并支持您的回答!
  • @George 如果对您有帮助,您可以将答案标记为已接受。它是它左边的绿色勾号(?)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多