классы друзей с указателями друг на друга - PullRequest
2 голосов
/ 16 декабря 2010

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

class A
{
protected:
   B *p;
};

class B
{
protected:
   A *p;
};

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

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

Ответы [ 7 ]

3 голосов
/ 16 декабря 2010

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

//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
};
2 голосов
/ 16 декабря 2010
class B;
class A {
    friend class B;
  protected:
    B *p;
};

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

Обратите внимание, что любые функции-члены A, которые фактически используют члены B, должны быть определены после определения 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; }
1 голос
/ 16 декабря 2010

простое использование: класс B;

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

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

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

1 голос
/ 16 декабря 2010

Вы можете использовать предварительное объявление, выполнив class B; над классом A

1 голос
/ 16 декабря 2010
class B;
class A
{
protected:
   B *p;
   friend class B;
};

class B
{
protected:
   A *p;
   friend class A;
};
1 голос
/ 16 декабря 2010
class A
{
protected:
   class B *p;
};

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

class B;

class A
{
friend class B;
protected:
   B *p;
};
1 голос
/ 16 декабря 2010

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

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