Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Друзья класса - путаница с заголовочными файлами


Автор: Hassel 29.6.2011, 22:17
Пусть есть два класса, A и B. У каждого есть заголовочный файл и файл реализации. Оба класса циклически связаны друг с другом:

Заголовочный файл a.h
Код

#include "b.h"

class A
{
  public:
    A( B & b );
    ~A();
    void test_friend( B & b );
};


Заголовочный файл b.h
Код

class A;

class B
{
  public:
    friend void A::test_friend( B & );
};


Подобный код у меня не компилируется (получаю сообщение про incomplete type A и forward declaration of struct A). Если не сложно, обясните ошибку.

Автор: volatile 30.6.2011, 01:12
Если только то, что вы написали, то проблему должна решить небольшая перетасовка:
Заголовочный файл a.h
Код

class B;
class A
{
  public:
    A( B & b );
    ~A();
    void test_friend( B & b );
};

Заголовочный файл b.h
Код

#include "a.h"
class B
{
  public:
    friend void A::test_friend( B & );
};


Автор: Hassel 30.6.2011, 11:15
Спасибо, volatile.

Сейчас попробую сформулировать:
1) "... функция-друг класса должна быть либо явно объявлена в охватывающей области видимости, либо иметь аргументы этого класса...". Страуструп, Язык программирования C++, 11.5.1 Поиск друзей
2) В момент, когда компилируется класс B, класс A объявлен, но методы класса A  не объявлены, следовательно, имеет место нарушение п.1

А вот что значит: "...функция-друг класса должна быть либо ... либо иметь аргументы этого класса...", до меня пока как-то не доходит smile Ведь формально получается именно так?


Автор: volatile 1.7.2011, 00:17
Цитата(Hassel @  30.6.2011,  11:15 Найти цитируемый пост)
В момент, когда компилируется класс B, класс A объявлен, но методы класса A  не объявлены, следовательно, имеет место нарушение п.1

Когда компилируется B, класс А (и естественно все его методы), уже объявлены, так как мы включили
#include "a.h"
Так что никакого нарушения нет.

Автор: Hassel 1.7.2011, 12:36
Да, правильно, я просто для себя хотел сформулировать, почему возникала ошибка. Еще раз спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)