在参数中需要2个类的朋友功能 - ' Class'没有定义的

时间:2014-11-02 16:37:18

标签: c++ friend-function

我在处理好友功能时遇到了一些问题。我想使用在参数中使用两个不同类的友元函数。以下是代码示例:

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_ */

ObjectA和ObjectB的.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 个答案:

答案 0 :(得分: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类,导致错误。

您可以使用前向类声明而不是#include在特定情况下中断此循环。

答案 1 :(得分:0)

Baybe使用模板功能代替?但是这样你就会打破封装。

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;
}