Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2008, 23:36   #1
Skoverdrive
 
Регистрация: 12.10.2008
Сообщений: 7
По умолчанию Как связать два класса?

Есть два класса, в первом должно быть поле с указателем на второй, во втором - с указателем на первый. Как такое реализовать? (при этом нужно будет вызывать методы класса B из Bptr и класса А из Аptr)
Наглядно:
Код:
class A {
...
   B *Bptr;
...
};

class B {
...
   A *Aptr;
...
};

Последний раз редактировалось rpy3uH; 14.10.2008 в 11:29.
Skoverdrive вне форума Ответить с цитированием
Старый 14.10.2008, 05:44   #2
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Skoverdrive Посмотреть сообщение
Есть два класса, в первом должно быть поле с указателем на второй, во втором - с указателем на первый. Как такое реализовать? (при этом нужно будет вызывать методы класса B из Bptr и класса А из Аptr)
Наглядно:
class A
{
...
B *Bptr;
...
};
class B
{
...
A *Aptr;
...
};
Код:
class B;
class A 
{
...
   B *Bptr;
...
};
class B 
{
...
   A *Aptr;
...
};
так пробовал?
если не получится - весь листинг декларации классов скинь.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 14.10.2008 в 05:47.
alexinspir вне форума Ответить с цитированием
Старый 14.10.2008, 19:45   #3
Skoverdrive
 
Регистрация: 12.10.2008
Сообщений: 7
По умолчанию

Код:
class B;
class A {
        public:
        A();
        void printA() {cout << "Print A";}; //например эту функцию нужно вызывать из Aptr (поле класса B)
        B *Bptr;
};

class B {
        public:
        B();
        void printB() {cout << "Print B";}; //например эту функцию нужно вызывать из Bptr (поле класса A)
        A *Aptr;
};

B::B() {
        Aptr = new A;
}

A::A() {
        Bptr = new B;
}

int main()
{
        A Aexs;

        Aexs.Bptr.printB(); //хотел сделать так

        return 0;
}
Так не получается - ошибка structure required on left side of . or .* в строке перед return 0;
Skoverdrive вне форума Ответить с цитированием
Старый 14.10.2008, 20:21   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Aexs.Bptr->printB();
pu4koff вне форума Ответить с цитированием
Старый 14.10.2008, 20:26   #5
Skoverdrive
 
Регистрация: 12.10.2008
Сообщений: 7
По умолчанию

Цитата:
Aexs.Bptr->printB();
- так ошибка Project1.exe raised exception class EStackOverflow with message 'Stack overflow'. Process stopped. Use Step or Run to continue.
При этом выделяется строка Aptr = new A; из конструктора класса В.
Использую C++ Builder 6.0
Skoverdrive вне форума Ответить с цитированием
Старый 14.10.2008, 21:04   #6
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Хорош извращаться! %)

Цитата:
class EStackOverflow
А ты что хотел? Не, я понимаю, конечно, что в конструкторе класса А надо вызвать конструктор класса В, а в конструкторе класса В вызвать конструктор класса А, но что-то тут не так, угадай с трех раз что именно
still_alive вне форума Ответить с цитированием
Старый 14.10.2008, 21:09   #7
Skoverdrive
 
Регистрация: 12.10.2008
Сообщений: 7
По умолчанию

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

Последний раз редактировалось Skoverdrive; 14.10.2008 в 21:13.
Skoverdrive вне форума Ответить с цитированием
Старый 14.10.2008, 21:24   #8
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
причем и для А и для В.
Если из А надо вызывать методы В, а из В методы А, то надо надрать уши тому, кто это придумал.

Мне кажется, что задание заключается в том, чтобы только из одного выбранного класса (А) вызывать методы другого (В), используя для этого указатель на его объект (В*). Это композиция и это нормально. Тут нужно четкое понимание того, чего от тебя хотят.
still_alive вне форума Ответить с цитированием
Старый 14.10.2008, 22:10   #9
Skoverdrive
 
Регистрация: 12.10.2008
Сообщений: 7
По умолчанию

Нужно и для А и для В.
Сам преподаватель предлагал объявлять пустой класс В_0, потом А с указателем на В_0, потом от В_0 наследовать В с указателем на А; но так тоже не получается, потому что нельзя из родителя вызывать методы потомка, т.е. не получится А.В_0ptr->printB();
Вот я думаю, может есть какой нестандартный способ это реализовать.

Вообще сама задача (точнее часть задачи) заключается в следующем: есть два свзанных понятия, например страна и турист. Так допустим класс А - страна, класс В - турист. В классе А храним указатель на массив туристов, которые в ней побывали, в классе В - указатель на массив стран, в которых побывал турист. Должна быть возможность распечатать всех туристов побывавших в какой-то определенной стране, или все страны, в которых побывал какой-то определенный турист. При этом полем должен быть обязательно указатель на другой класс, нельзя хранить например массив строк с названиями стран (или фамилий туристов). Т.о. функция, которую нужно вызывать и из А и из В - функция печати названия (или фамилии соответственно).

Последний раз редактировалось Skoverdrive; 14.10.2008 в 22:30.
Skoverdrive вне форума Ответить с цитированием
Старый 15.10.2008, 06:08   #10
mmauzer
Новичок
Джуниор
 
Регистрация: 21.02.2008
Сообщений: 1
По умолчанию

Цитата:
В классе А храним указатель на массив туристов, которые в ней побывали, в классе В - указатель на массив стран, в которых побывал турист.
Таким образом где-то в программе должены быть определены массив объектов класса А и В соответственно. Так?

Тогда делаем конструктор с параметром типа A(B* array): aPtr(array){} и тоже самое соответственно с В.

Потом в Main`е уже передаем имена массивов объектов в конструкторы классов в качестве параметра и вуаля.
mmauzer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как связать ShellChangeNotifier с ShellComboBox lexaltd Компоненты Delphi 6 22.07.2008 00:01
Как связать C++ и Access? demon-189 Общие вопросы C/C++ 1 23.04.2008 19:49
DBChart как связать с БД ? Cantana Помощь студентам 2 02.02.2008 14:40
Как связать две программы на Паскале Romanus Паскаль, Turbo Pascal, PascalABC.NET 3 29.07.2007 21:09
Как связать кнопку с таблицей Таня84 БД в Delphi 1 31.01.2007 14:02