2016-08-29 4 views
1
#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'  
+0

У вас уже есть то, что вы хотите. Вы хотели спросить о проблеме, которую вы испытываете с помощью функции 'sun', говорящей, что' hobj' имеет неполный тип? – NathanOliver

+0

В чем проблема, точно? – edtheprogrammerguy

+1

Рассмотрите возможность сделать их одним и тем же классом, если они плотно связаны. – chris

ответ

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(); 
} 
+0

Чтобы добавить к ответу @Biagio Festa, это решение можно расширить, добавив определения функций-членов каждого класса в отдельные исходные файлы (по одному файлу для каждого класса) и определение каждого класса в своем собственном заголовке (с объявлением вперед для другой класс перед определением класса; 'demo.h' forward объявляет' class hello; 'и' hello.h' forward объявляет 'class demo;'). Каждый исходный файл может затем '# включать'' 'demo.h' и' hello.h', что приведет к тому, что оба класса будут полными типами в каждом исходном файле. Вот как более сложные проекты имеют тенденцию справляться с такой ситуацией. –

0

Ваша проблема не имеет ничего общего с тем, как вы создали классы дружить друг с другом, но и в том, что вы пытаетесь создать переменную неполный type. в

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(); 
} 
+0

Точно то, что я написал :) –