2010-10-29 56 views
12

我重載了一個類的< <操作符。如果我想在指針上使用它,我該如何重載運算符,如下所示?在指針上使用重載操作符

class A { 
    std::string operator<<(std::string&); 
} 

aInst << "This works"; 
aPointer << "This doesnt work"; 
aPointer->operator<<("Whereas this works but is useless"); 

我希望你能幫助我。

heinrich

回答

23

您需要先取消引用指針。

A *ptr = new A(); 
(*ptr) << "Something"; 

唯一的另一種方法是你在上面

編輯描述方式:下面安德烈的解決方案是可行的,以及,但像他說,這可能不是一個好主意。

3

你不能那樣做。操作符函數僅考慮枚舉或類類型的操作數。

你畢竟轉移了一個指針,而不是一個類。你需要明確地說你想通過首先解引用指針轉移到類對象。

+0

@sbi,謝謝。固定 – 2010-10-29 20:19:34

+0

(請注意,「班級類型」包含結構和聯合。) – sbi 2010-11-01 16:30:25

+0

@sbi正確。結構和聯合是類。當結構和聯合是合適的運算符的操作數時,就會考慮操作符函數,就像使用「class」類鍵聲明的類一樣。 – 2010-11-01 17:28:59

0

通常這樣做沒有什麼好的理由,因爲語義上的操作符< <返回流對象的引用。從技術上講,你基本上不能這樣做。

+2

不,語義上'operator <<'應該返回左邊的參數。 – 2010-10-29 19:26:04

10

首先,要堅持標準的約定,您operator<<應該聲明如下:

class A { 
    A& operator<<(const std::string&); 
}; 

現在,從技術上講,你可以成功者的要通過實施以下全局函數什麼部分

A * operator<< (A * a, const std::string& s) { (*a) << s; return a; } 

這將使語句,如:

但是,您將不能寫:

aPointer << "this will not compile."; 

在任何情況下,寫出這樣的操作會混淆,充其量。你應該用的

(*aPointer) << "this will be printed."; 

更簡單的語法生活和編寫堅持既定的慣例,讓別人的代碼(和你自己,在幾個星期)來讀取你的代碼。