2012-04-05 69 views
1

我有幾個文件導致編譯錯誤,可以做以下事情嗎?C++通過引用傳遞 - 可以這樣做嗎?

那麼header1.h

class Class1{ 
public: 
void function1(Class1 &); 
}; 

header2.h

class Class2{ 
public: 
void function2(Class2 &, Class1 &); 
}; 

cpp2.cpp

#include "header2.h" 
void Class2::function2(Class2 & my2Class, Class1 & my1Class){}; 

的main.cpp

#include "header1.h" 
#include "header2.h" 

// functions 

錯誤是指出,header2.h不知道Class1作爲類型。我怎樣才能在這個頭文件中聲明一個類型爲Class1的對象,而不使用include或者不將兩個類放在同一個文件中(它們是完全獨立的,只應該在main中調用函數)?

謝謝!

回答

7

您可以使用前置聲明:

class Class1; //forward declare Class1 
class Class2{ 
public: 
void function2(Class2 &, Class1 &); 
}; 

傳遞一個類型的參數的函數不要求完全定義的類型。

+0

這接縫最好的工作在我的具體應用。我還必須在我的cpp2.cpp文件中包含header1.h。謝謝你的回覆! – 2012-04-05 15:04:52

+0

請接受我的道歉,上面是一個錯字。謝謝! – 2012-04-05 15:09:35

+0

@ChrisJones :)))你有點正式。我只是認爲你犯了一個錯誤(而不是錯別字),並且在你退出SO之前發出警告並將該代碼投入生產。 :P – 2012-04-05 15:12:19

0

讓每個頭都包含它需要信息的每個頭,但帶有預處理定義以避免循環引用或重複聲明。例如 HEADER2應該

#ifndef FUNCS_H 

#define FUNCS_H 

#include "header1.h" 

    class Class2{ 
    public: 
    void function2(Class2 &, Class1 &); 
    }; 
#endif 

這是我做我的頭在C++

+0

雖然確實應該添加預處理器警衛。這無助於避免循環引用。 – 2012-04-05 14:06:38

+0

你也應該更喜歡前向聲明而不是包含。 – 2012-04-05 14:08:25

+0

爲什麼前向減法更好?我原以爲僅僅包括其他頭文件就具有相同的最終效果,並且可以節省您每次意識到需要時明確向前聲明某些內容的麻煩。 – Oofpez 2012-07-09 11:37:12