2014-01-29 78 views
1

我有這個類的定義:如果C++中+運算符重載的第二個操作數爲零,如何返回第一個操作數?

class foo{ 

public: 
    foo(); 
    foo(const int& var); 
    foo(const foo& var); 
    ~foo(); 

    const foo operator +(const foo& secondOp) const; 

private: 
    int a; 
    //plus other values, pointers, e.t.c. 

}; 

而且我有此實施 '+' 操作符重載:

const foo foo::operator +(const foo& secondOp) const{ 

    //I want here to check if i have one operand or two... 
    if ((FIRST_OPERAND.a!=0) && (secondOp.a==0)){ 
     cout << "ERROR, second operand is zero"; 
     return FIRST_OPERAND; 
    } 
    else if ((FIRST_OPERAND.a==0) && (secondOp.a!=0)){ 
     cout << "ERROR, first operand is zero"; 
     return secondOp; 
    } 

} 

當我寫在main()

foo a(2); 
foo b; 
foo c; 

//I want here to print the ERROR and 
//return only the values of a 
c = a + b; 
  1. 如果第二個操作數爲零,並且可以,我可以將第一個操作數的值設爲return反之亦然?
+1

讓'operator +'返回一些具有相關信息的任意類型的對象,並且僅爲該類型重載'operator ='。 – 0x499602D2

+4

如果第二個操作數丟失,你的代碼看起來像'c = a +;',對吧?這根本不會編譯。 –

+0

你能更具體嗎?用代碼示例? @ 0x499602D2 – MinimalTech

回答

2

你快到了。由於它是一個成員函數,所以第一個操作數是*this,所以用this->aa替換FIRST_OPERAND.a

但是,使它成爲允許在兩個操作數上進行轉換的非成員函數可能更好(即能夠編寫a + 22 + a)。它需要成爲朋友才能訪問私人會員。

friend foo operator +(const foo& firstOp, const foo& secondOp); 

而且,最好不要返回一個const值作爲防止返回值移動。

0

它是編譯器檢查程序的語法正確性。這是無法辨別是否真的想寫

c = a; 

就是做任務,或者你想寫

c = a + b; 

的兩個語句是正確的。

這是一個所謂的邏輯錯誤。編譯器無法看到我們的東西。

+0

謝謝您的幫助,我之前提出了錯誤的問題... – MinimalTech

0

對於您的行c = a;賦值運算符由編譯器實現(只是淺拷貝對象內存)。 這就是你的代碼編譯「沒有第二個操作數」的原因。

如果您不想使用賦值操作符 - 隱藏它。例如。通過與private訪問修飾符一起實現。

+0

感謝您的幫助,我之前提出了錯誤的問題... – MinimalTech

相關問題