2014-11-02 72 views
1

我在處理好友函數時遇到了一些問題。我想使用在參數中使用兩個不同類的朋友函數。下面是代碼的示例:在參數中需要2個類的朋友函數 - 未定義'類'

ObjectA.h:

#ifndef OBJECTA_H_ 
#define OBJECTA_H_ 

#include "ObjectB.h" 

#include <iostream> 
using namespace std; 

class ObjectA { 
private: 
    friend void friendFunction(ObjectA &,ObjectB &); 

public: 
    ObjectA(); 
    virtual ~ObjectA(); 
}; 

#endif /* OBJECTA_H_ */ 

ObjectB.h:

#ifndef OBJECTB_H_ 
#define OBJECTB_H_ 

#include <iostream> 
using namespace std; 

#include "ObjectA.h" 

class ObjectB { 
private: 
    friend void friendFunction(ObjectA &, ObjectB &); 

public: 
    ObjectB(); 
    virtual ~ObjectB(); 
}; 

#endif /* OBJECTB_H_ */ 

爲對象A和對象B兩者cpp文件是空的(空的構造和析構)。這裏是主要的.cpp文件:

#include <iostream> 
using namespace std; 

#include "ObjectA.h" 
#include "ObjectB.h" 

void friendFunction(ObjectA &objA, ObjectB &objB){ 
    cout << "HIIIIIIIIIII"; 
} 

int main() { 
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! 

    return 0; 
} 

這所有的事情向我發送以下錯誤:

'ObjectA' has not been declared 

而這個錯誤是指向該線路ObjectB.h:

friend void friendFunction(ObjectA &, ObjectB &); 

如您所見,ObjectA.h文件已包含在ObjectB.h文件中。所以我不知道我的錯誤來自哪裏。

也許我用錯誤的方式使用朋友功能?

謝謝你們!

回答

2

在ObjectA.h,替換:

#include "ObjectB.h" 

有:

class ObjectB; 

請在ObjectB.h相應的改變。

發生什麼事是main.cpp包含ObjectA.h。在聲明ObjectA類之前,ObjectA.h包含ObjectB.h。當ObjectB.h嘗試再次包含ObjectA.h 時,#ifndef OBJECTA_H_測試失敗,這意味着ObjectA類在聲明friend函數時未聲明,導致出錯。

您可以通過使用前向類聲明而不是#include來打破您的特定情況下的此循環。

+0

你是最棒的男人! – Xema 2014-11-02 17:00:15

0

貝貝使用模板函數來代替?但是這樣你會打破封裝。

class A{ 
private: 
    template<typename T, typename B> 
    friend void friendFunc(const T&, const B&); 
    int m_a; 
}; 

template<typename A, typename B> 
void friendFunc(const A& a, const B& b){ 
    std::cout << a.m_a << std::endl; 
} 

int main(int argc, char **argv) {  
    friendFunc<A, int>(A(), int(3)); 
    return 0; 
} 
相關問題