2016-03-07 50 views
-3

對不起,這是一個這樣簡單的問題。我一直在使用tutorialspoint.com來學習C++。目前我正試圖瞭解類和運算符重載。對於其他的成員函數,該網站採用了這種約定運算符在類之外重載定義 - C++

class Box { 
    private: 
     int Volume; 
    public: 
     Box(int num); 
     ... 
    } 
    Box::Box(int num) { 
     Volume = num; 
    } 

然而,超載運營商的時候,他們用這個

 class Box { 
     private: 
     int volume; 
     public: 
     Box(int num); 
     Box operator+(const Box &b) { 
     Box box; 
     box.volume = this->volume + b.volume; 
     return box; 
     } 
     } 

它們定義在類中的重載函數。是否有可能在課堂外定義它?如果是這樣,怎麼樣?我試過

 Box Box::operator+(const Box &b) {...} 
    Box::Box operator+(const Box &b) {...} 

但這些不工作

如何做到這一點的一類之外?

再次,抱歉,這是一個這樣簡單的問題。 感謝

編輯 我的代碼看起來像這樣

#include <iostream> 
#include <string> 
using namespace std; 

class Box { 
private: 
    int volume; 
public: 
    Box(int num); 
    Box operator+(const Box &b); 
}; 

Box::Box(int num) { 
volume = num; 
} 

Box Box::operator+(const Box &b) { 
Box box; 
box.volume = this->volume + b.volume; 
return box; 
} 

int main() { 
Box one(2); 
Box two; 
two = one + one; 
} 

我的錯誤是

Overloading.cc: In member function 'Box Box::operator+(const Box&)': 
    Overloading.cc:18:6: error: no matching function for call to 'Box::Box()' 
    Overloading.cc:18:6: note: candidates are: 
    Overloading.cc:13:1: note: Box::Box(int) 
    Overloading.cc:13:1: note: candidate expects 1 argument, 0 provided 
    Overloading.cc:5:7: note: Box::Box(const Box&) 
    Overloading.cc:5:7: note: candidate expects 1 argument, 0 provided 
    Overloading.cc: In function 'int main()': 
    Overloading.cc:25:6: error: no matching function for call to 'Box::Box()' 
    Overloading.cc:25:6: note: candidates are: 
    Overloading.cc:13:1: note: Box::Box(int) 
    Overloading.cc:13:1: note: candidate expects 1 argument, 0 provided 
    Overloading.cc:5:7: note: Box::Box(const Box&) 
    Overloading.cc:5:7: note: candidate expects 1 argument, 0 provided 
+4

一日一應該罰款。你是什​​麼意思「不工作」?任何錯誤消息? – songyuanyao

+0

當你說「這些行不通」時,你的意思是什麼?你有構建錯誤嗎?意外的結果?還有別的嗎?請詳細說明,並給我們更多詳細信息(包括如果您有它們會產生錯誤)。 –

回答

3

是的,這是可能的,共同的,對類儘可能之外定義操作符。 你要這個:

Box operator+(const Box& left, const Box& right) { ... } 

編輯:

如果你的意思是你要聲明運營商作爲一個成員函數和其他地方定義它(在CPP),那​​麼它是:

^h

class Box 
{ 
    Box operator+(const Box& other) const; 
}; 

CPP

Box Box::operator+(const Box& other) const { ... } 

編輯2: 現在您已經發布了錯誤。創建Box two;時,您正嘗試使用默認構造函數但是,由於您創建了非默認構造函數Box(int),因此編譯器不會爲您生成默認構造函數。

+2

我認爲OP的意思是「成員函數」。 – songyuanyao

+0

謝謝。我認爲如果沒有定義默認的構造函數,編譯器會自行將成員變量設置爲默認值。例如所有整數默認爲0,所有指向NULL的指針等。 –

1

錯誤消息無關運算符重載,它只是抱怨Box沒有默認constuctor(即Box::Box())的聲明Box box;Box two;

您可以添加一個默認的構造函數的話,如:

class Box { 
private: 
    int volume; 
public: 
    Box() : volume(0) {} 
    ~~~~~~~~~~~~~~~~~~~~ 
    Box(int num); 
    Box operator+(const Box &b); 
}; 

或更改語句指定的參數,如:

Box box(0); 
+0

謝謝。 FILLER_TEXT –