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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инклуд по кругу... два класса 
V
    Опции темы
Kolia
Дата 5.6.2005, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



Народ, есть проблема. Вот есть два класса. Каждый из них имеет переменную член другого класса. Только вот сие дело не хочет компилироваться. Как тут быть.

a.h
Код

#pragma once
#include <iostream>
using namespace std;

#include "b.h"

class A :
{
public:
    B b;
    A(){};
    ~A(){};
    void ShowA(){cout<<"Class A";};
    
};

b.h
Код

#pragma once

#include <iostream>
using namespace std;

#include "a.h"

class B
{
public:
    A a;
    B(){};
    ~B(){};
    void ShowB()
    {
        cout<<"Class B";
        a.ShowA();
    };
};


Какие идеи???
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
srd
Дата 5.6.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Так нельзя. Используй в качестве члена класса указатель на объект другого класса, а не непосредственно объект.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Kolia
Дата 5.6.2005, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



Цитата(srd @ 5.6.2005, 18:08)
Так нельзя. Используй в качестве члена класса указатель на объект другого класса, а не непосредственно объект.

И как это решает проблему?

error C2027: use of undefined type '...'
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
srd
Дата 5.6.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Замечательно это решает проблему
a.h
Код

#pragma once

class B;

class A
{
public:
    // ...
    B *b;
    // ...
};

b.h
Код

#pragma once

#include "a.h"

class B
{
public:
    // ...
    A *a;
   // ...
};

Реализацию всех методов класса А, которым требуется доступ к членам класса B, выносишь в CPP-файл (а не определяешь их прямо в заголовке), в котором включаешь оба заголовочных файла. Для класса B - аналогично.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Royan
Дата 5.6.2005, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

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



В даннм случае #pragma once лучше заменить на более классический вариант
Код

#ifndef
#define __A
   // Собственно описание класса
#endif



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Kolia
Дата 5.6.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



По ходу заработало smile
Спасибо.
Добавлено @ 20:47
Цитата(Royan @ 5.6.2005, 19:19)
В даннм случае #pragma once лучше заменить на более классический вариант
Код

#ifndef
#define __A
   // Собственно описание класса
#endif

Мне просто интересно, а чем данная запись лучше? Та покороче. Сам так писал, но вот на #pragma once перешел
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
Alastis
Дата 6.6.2005, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

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



Kolia
#pragma once
эта директива действует только для майкрософтовских компилеров, так что если не планируешь менять компилятор, то можешь ничего не изменять


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
srd
Дата 6.6.2005, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



#ifdef/#endif будут однозначно поняты всеми компиляторами, в то время как #pragma once - вещь нестандартная и не всеми компиляторами понимается, а может и пониматься по разному (например, в MSVC++ 6.0 #pragma once не работает, если в одном месте заголовок включается как #include "aa.h", а в другом - #include "../hdr/aa.h" и т.п.). Но при этом второй способ может уменьшить скорость компиляции, т.к. если транслятор найдёт #ifdef, ему всё равно надо пропарсить весь заголовок, чтобы добраться до последнего #endif, в то время как с #pragma once транслятор может немедленно завершить работу с заголовком.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
DENNN
Дата 6.6.2005, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(srd @ 6.6.2005, 06:45)
Но при этом второй способ может уменьшить скорость компиляции, т.к. ....

Резюме: используем оба способа одновременно smile

PM ICQ   Вверх
Kolia
Дата 8.6.2005, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 132
Регистрация: 11.7.2003
Где: Вильнюс

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



Цитата(srd @ 6.6.2005, 06:45)
#ifdef/#endif будут однозначно поняты всеми компиляторами, в то время как #pragma once - вещь нестандартная и не всеми компиляторами понимается, а может и пониматься по разному (например, в MSVC++ 6.0 #pragma once не работает, если в одном месте заголовок включается как #include "aa.h", а в другом - #include "../hdr/aa.h" и т.п.). Но при этом второй способ может уменьшить скорость компиляции, т.к. если транслятор найдёт #ifdef, ему всё равно надо пропарсить весь заголовок, чтобы добраться до последнего #endif, в то время как с #pragma once транслятор может немедленно завершить работу с заголовком.

Ясна
--------------------
Риспект
PM MAIL ICQ Skype GTalk MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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