如何让两个班级互相朋友?

时间:2016-08-29 17:37:24

标签: c++

#include <iostream>
using namespace std;
class hello;
class demo 
{
private : 
    void fun()
    {
        printf ("Inside fun \n");
    }
public :
    void sun()
    {
        hello hobj;
        hobj.run();
    }
    friend class hello; 
};

class hello
{
private :
    void run ()
    {
        printf("Inside Run \n");
    }
public :
    void gun ()
    {
        demo dobj;
        dobj.fun();
    }
    friend class demo;
};

int main ()
{
    demo dobj1;
    dobj1.sun();
    cout<<"Inside Demo \n";
    hello hobj1;
    hobj1.gun();
    cout<<"Inside hello \n";
    return 0;
}

如何让彼此成为两个班级的朋友? 我知道如何让其他班级的一个班级朋友,但不知道如何让它成为彼此的朋友,我尝试单独的前进声明,这两个班级仍然不起作用?是否有可能做到这一点 ?

它一直给我这些错误

error C2228: left of '.run' must have class/struct/union
error C2079: 'hobj' uses undefined class 'hello'    

2 个答案:

答案 0 :(得分:3)

我认为你的问题在于使用不完整类型

void sun() {
  hello hobj;
  hobj.run();
}

当您定义函数sun()时,已声明类hello但尚未 。这就是为什么你不能在函数中使用它,编译器应该给你一个错误。

为了解决这个问题,只需在sun()类的定义之后定义函数hello

因此,您的班级demo将是:

class hello;

class demo {
 // ...
 public:
  void sun();  // declaration  
  friend class hello;
};

// ...

class hello {
 // ...
};

void demo::sun() {
  // here the implementation and you can use 'hello' instance w/o problem.
  hello hobj;
  hobj.run();
}

答案 1 :(得分:0)

您的问题与如何将类设置为彼此的朋友无关,而是因为您尝试创建不完整类型的变量。在

void sun()
{
    hello hobj;
    hobj.run();
}

hello仍然是不完整的类型,因此您无法创建该类型的对象。您需要做的是将成员函数移出行并在hello被定义为

之后声明它
class demo 
{
    //...
public :
    void sun();  // <- just a declaration here
    friend class hello; 
};

class hello
{
    //...
};

void demo::sun() // <- definition here
{
    hello hobj;
    hobj.run();
}