2010-12-16 3 views
2

Как создать два класса, которые имеют указатели на элементы класса друг друга, с полным доступом к данным друг друга? Другими словами, мне нужно два класса, как это:классы друзей с указателями друг на друга

class A 
{ 
protected: 
    B *p; 
}; 

class B 
{ 
protected: 
    A *p; 
}; 

У меня возникли проблемы с ним, потому что я не до наравне с конвенциями C++, и, очевидно, класс А не может объявить класс B, потому что B объявляется позже в коде.

Спасибо за помощь

+2

C++ это место, где друзья имеют доступ к ваших частных членов. Стоит упомянуть это здесь: P – jrharshath 2010-12-16 12:40:11

+2

Конечно, вопрос: если у вас есть два класса, которые так тесно связаны друг с другом, вы уверены, что ваш дизайн верен? Конечно, звучит так, будто у вас где-то есть граница класса. – GrahamS 2010-12-16 13:33:57

ответ

3

Вы должны использовать объявление прямого класса.

//in A.h 

    class B; // forward declaration 
    class A 
    { 
    protected: 
     B *p; 
     friend class B; // forward declaration 
    }; 

//in B.h 
class A; // forward declaration 
class B 
{ 
protected: 
    A *p; 
    friend class A; // forward declaration 
}; 
1

вы должны использовать вперед декларацию, как:

class B; 
class A{ 
    ... 
    friend class B; 
}; 
+0

Спасибо ... А как насчет дружбы? – oldSkool 2010-12-16 12:23:15

+0

класс друга B; – kinnou02 2010-12-16 12:25:35

1
class A 
{ 
protected: 
    class B *p; 
}; 

Если вы хотите объявить дружбу, необходимо опережающее объявление:

class B; 

class A 
{ 
friend class B; 
protected: 
    B *p; 
}; 
1
class B; 
class A 
{ 
protected: 
    B *p; 
    friend class B; 
}; 

class B 
{ 
protected: 
    A *p; 
    friend class A; 
}; 
1

Вы можете использовать форвардное декларацию n путем выполнения class B; выше класса A

1

Простой способ использования: класс B;

class A 
{ 
    protected: 
     B *p; 
     friend class B; 
}; 

class B 
{ 
    protected: 
     A *p; 
     friend class A; 
}; 

Использование класса B; означает прямое объявление, и это в основном говорит компилятору: «класс B существует где-то».

2
class B; 
class A { 
    friend class B; 
    protected: 
    B *p; 
}; 

class B { 
    friend class A; 
    protected: 
    A *p; 
}; 

Обратите внимание, что любые функции члена, которые на самом деле использовать член B должны быть определены после определения В, например:

class B; 
class A { 
    friend class B; 
    protected: 
    B *p; 
    A *getBA(); 
}; 

class B { 
    friend class A; 
    protected: 
    A *p; 
}; 

A *A::getBA() { return p->p; } 
Смежные вопросы