2013-02-19 85 views
0

我的問題: 我想重載指向兩個不同類的賦值運算符。下面是一個例子:重載賦值運算符指向兩個不同的類

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; 
} 

我收到以下錯誤信息:這一切

error: cannot convert 'ic*' to 'dc*' in assignment

作品,如果我引用的,而不是指針做到這一點。不幸的是,因爲我想使用指向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; 

這就是爲什麼我想這樣做的原因。請讓我知道這是否可能。對我來說,編譯器似乎想調用指向指針的默認指針而不是重載的指針。

感謝您的幫助提前!

+0

你使用指針的原因是有缺陷的。至於你沒有使用引用的推理。你會通過使用引用來實現你正在嘗試的。 – 2013-02-19 01:13:51

+0

您不能爲內置類型重載運算符。 – 2013-02-19 01:15:02

+0

嗨德魯, 感謝您的快速回復。所以你說可以使用引用作爲成員? 我正在使用的這本書說以下有關參考文獻: 1.參考創建時必須初始化。 (指針可以在任何時候初始化。) 2.一旦引用被初始化爲一個對象,它就不能被改變來引用另一個對象。 (指針可以隨時指向另一個對象。) 3.不能有NULL引用。您必須始終能夠假定參考連接到合法的存儲器。 如果你知道wrk arnd。你可以請我sw! TX! – George 2013-02-19 01:17:33

回答

8

您不能重載運算符指針。

一個選項,如果你想堅持使用操作符重載是讓指針包裝對象,它包含一個指向對象的對象 - 本質上是一個智能指針,和過載該對象的運營商。

+0

嗨Karthik, 感謝您的回答。這是一個好主意!會試試看。 雖然有一個問題:如果我超載=運算符讓我們這樣說吧: ic * operator =(ic * i){將數據從i複製到左手邊; } 這實際上有效。所以你可以重載指針的賦值操作符。對我來說,問題似乎是lhs和rhs不是同一類型。 (不幸的是我還不能upvote b/c我沒有足夠的代表) – George 2013-02-19 01:32:48

+0

嗨!所以我已經在我正在進行的項目中實現了您的答案,並且它完美地工作!我希望有足夠聲譽的人出席並提出你的答案! – George 2013-03-01 01:46:10

+0

@George你可以標記答案爲接受,如果它幫助你。它是左邊的綠色勾號(?)。 – 2013-03-01 02:15:19