2013-10-27 36 views
2

我有一個「Foo.cpp」類和一個「Bar.cpp」類。我想在Foo的兩個參數上重載+操作符,以便添加兩個Foos返回一個Bar,其值是它們值的乘積。該代碼看起來像C++從類中的函數實例化不同的類

//Foo.h 
class Foo 
{ 
public: 
    double foo_val; 
    Foo(); 
    Foo(double); 
}; 

Bar* operator+ (Foo&, Foo&) 

//Foo.cpp 
#include "Foo.h" 

Foo::Foo(){foo_val = 0;} 
Foo::Foo(double d){foo_val = d;} 

Bar* operator+ (Foo& f1, Foo& f2){ 
    return new Bar(f1.foo_val*f2.foo_val); 
} 

#include "Foo.h" 
#include "Bar.h" 
int main(){ 
    Foo f1 = new Foo(4, 5); 
    Foo f2 = new Foo(1, 2); 
    Bar = f1+f2; 
} 

Bar與Foo在此基本相同,它有一個構造函數「Bar(double);」

目前它不工作,我認爲因爲在我試圖製作一個新的之前Bar尚未定義。 (編譯器錯誤是「'Bar'沒有命名一個類型」)但是,我知道我不能在前面轉發declare Bar,因爲它只能用於指針,而我正在嘗試構建一個新的。有什麼方法可以讓這種類型的東西起作用,或者我是否完全錯誤?

謝謝!

+0

我認爲像這樣定義運算符+函數可能會更好:Bar運算符+(const Foo&f1,const Foo&f2)。否則,你應該跟蹤Bar *,並且不能做出像f1 + f2 + B2這樣的東西。看看這個頁面http://users.cms.caltech.edu/~donnie/cs11/cpp/cpp-ops.html – phoad

回答

2

其實很簡單。在Foo.h,你需要向前聲明class Bar,使operator+聲明是有效的:

class Bar; 

class Foo 
{ 
    // ... 
}; 

Bar* operator+ (Foo& f1, Foo& f2); 

然後,在Foo.cpp,則需要include Bar.h,因爲在這裏,你真的需要知道Bar是如何宣稱:

#include "Foo.h" 
#include "Bar.h" 

// ... 

Bar* operator+ (Foo& f1, Foo& f2) 
{ 
    // Now you can use Bar's constructor 
    return new Bar(...); 
} 
0

有兩種選擇。

(1)把

#include "Bar.h" 

Foo.h開始。但如果Bar.h已經有#include "Foo.h",這將導致循環依賴,所以這是而不是一個可行的選擇。

(2)將

class Bar; 

Foo.h,的Foo類定義之前。

+0

爲什麼(1)首選?你應該總是喜歡頭文件中的前向聲明,因爲它可以節省編譯時間。 –

+0

好問題。除了這是我一直以來做的事,我沒有別的理由。我刪除了該偏好。 (但是我相信編譯時間是可以忽略的,但是,如果你確保頭文件只包含一次。) –

+0

@FerdinandBeyer在這裏保存編譯時間是最不重要的。將標題包含在另一個標題中,可以創建它們之間的依賴關係,這從SW工程的角度來看是錯誤的(除非依賴關係是真實的和設計的)。 – SomeWittyUsername