2013-07-22 29 views
0

我與操作符重載掙扎,因爲我希望它允許鏈接重載移位運算符<<允許鏈接

class A{ 
int a; 
public: 
void doSomething(char *str); 
A operator<<(char *str); 
} 

所以我有這個類和什麼我能做的就是採取一個字符串,做一些事情,這對於這個問題並不重要。

我現在可以做的是

A *counter = new A(); 
counter->doSomething("hello"); 

如果我實現重載移位運算符

A A::operator<<(char *str) 
{ 
    this->doSomething(str); 
    return this; 
} 

我能寫這樣的

A *counter = new A(); 
(*counter) << "hello"; 

我希望我沒有在這裏犯了一個錯誤,因爲現在我想知道我怎麼可以允許鏈接

(*counter) << "hello" << "test"; 

我知道,與鏈接它會做到這一點

​​

這顯然沒有任何意義,因爲有兩個字符串/字符數組 但我知道有一種方法可以做到這一點。我GOOGLE了它,但每個問題只是關於鏈接在同一類型的實例

然後我試着把兩個參數放入函數並添加它作爲一個朋友......我不知道,但也許我必須做一個新的重載操作符,類型爲char*或流對象,並使其成爲A的朋友?

感謝您的幫助,我想應該有一種簡單的答案,我現在沒有看到。

+0

你的運營商會更好地考慮'const char *'。 –

回答

5

你需要一個參考返回*this,讓您的返回類型必須是A&

A& operator<<(char *str) 
{ 
    this->doSomething(str); // as before 
    return *this;   // return reference to this instance. 
} 
+2

那麼,你*可以*通過價值和連鎖電話回報就好。但你可能想解釋爲什麼你平時*想要*通過引用返回。 – jrok

+0

完美,工作正常,有道理 – raemaerne

1

operator <<應該返回鏈接的參考。

A& operator<<(char *str); 

A& A::operator<<(char *str) 
{ 
    this->doSomething(str); 
    return *this; 
} 

應採用像

A counter; 
counter << "hello" << "test"; 
0
A *counter = new A(); 

使你的「反'指針,而不是對象。要在A上使用運算符,您可以使用

(*counter) << "hello" 

此外,我建議您再次考慮重載運算符。雖然起初它似乎是一個很酷的想法,但它很容易導致難以理解和維護的代碼。

+0

'(* A)<<「hello」'應該是'(* counter)<<「hello」'。 – ForEveR

+0

啊你說得對。我會在我的文章中更改 – raemaerne

+0

糟糕,ForEveR是正確的,我會更新我的答案。 – ecotax

2

我想澄清你的問題中有兩個錯誤的假設。

  1. 當你想調用operator<<上的指針,你必須爲每一個來完成這一 ,不僅是第一個。這就是爲什麼

    A *counter = new A(); 
    (*counter) << "hello"; 
    

    作品,但

    (*counter) << "hello" << "test"; 
    

    沒有。第二個operator<<將被調用第一個返回的指針 ,這不是你想要的。你不得不寫 (這是醜陋的):

    (*((*counter) << "hello")) << "test"; 
    
  2. 移位運算符可以鏈接,然後從左 正確評價,這就是爲什麼下面是另一個錯誤的假設:

    A << "hello" << "test"; 
    

    我知道,與鏈接它會做到這一點

    A.operator<<("hello" << "test"); 
    

    它實際上是評價是這樣的:

    A.operator<<("hello").operator<<("test"); 
    

    是,更詳細:

    (A.operator<<("hello")).operator<<("test"); 
    

鏈運營商是可能的,如果對象由operator<<也 工具operator<<回來,所以你可以返回*this的副本,其中 的類型爲A。但是,這將複製對象是 是不必要的,因爲它最可能暫時只能生活非常 ,並且只被以下運算符使用一次。

所以,你想要做的是返回一個參考operator<<,上下一operator<<可以被調用。這避免了複製:

A& operator<<(char *str) 
{ 
    this->doSomething(str); 
    return *this; 
} 

返回一個指針是可能的,但不會導致你想要的,如上所述。語法會非常難看。

+0

+1 - 很好的解釋。 Re「當你想在指針上調用'operator <<'時,你必須爲每次調用都做到這一點,而不僅僅是第一次。」 - 當'operator <<'是一個成員時,這是真的,但如果奇怪的話,一個非成員的'T *運算符<<(T *,const char *)'也是可以想象的...... –

+0

是的,這是可能的,但確實奇怪。我不會建議在左側重載任何類型的指針的操作符。只是因爲它看起來很奇怪。 – leemes