Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Друзья класса - путаница с заголовочными файлами 
:(
    Опции темы
Hassel
Дата 29.6.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



Пусть есть два класса, 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). Если не сложно, обясните ошибку.
PM MAIL   Вверх
volatile
Дата 30.6.2011, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Если только то, что вы написали, то проблему должна решить небольшая перетасовка:
Заголовочный файл 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 & );
};


PM MAIL   Вверх
Hassel
Дата 30.6.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



Спасибо, volatile.

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

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



Это сообщение отредактировал(а) Hassel - 30.6.2011, 11:16
PM MAIL   Вверх
volatile
Дата 1.7.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



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

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

PM MAIL   Вверх
Hassel
Дата 1.7.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Hassel - 1.7.2011, 12:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.