Перекрестные указатели

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
®B!N
Сообщения: 19
Зарегистрирован: 10 мар 2005, 20:52
Откуда: Ужгород, Украина
Контактная информация:

как сделать перекрестные ссылки между классами a и b. Классы описываются в отдельных файлах a.cpp a.h b.cpp b.h
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

самый простой способ объявить void указатели а в нужных операциях приводить их к тому что надо (чем ты их проинициализировал)
В SAD - все в SAD.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

В файле A.h пишешь:

Код: Выделить всё

class B;

class A  
{
public:
	A();
	virtual ~A();
	B* m_pB;
};
В файле B.h пишешь:

Код: Выделить всё

class A;

class B  
{
public:
	B();
	virtual ~B();
	A* m_pA;
};
В файле A.cpp пишешь:

Код: Выделить всё

#include "A.h"
#include "B.h"

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

A::~A()
{
	delete m_pB;
}
В файле B.cpp пишешь:

Код: Выделить всё

#include "B.h"
#include "A.h"

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

B::~B()
{
	delete m_pA;
}
Yurich
Сообщения: 107
Зарегистрирован: 23 фев 2004, 19:07

2 WinMain...

И после этого смотришь как программа в цикле выделяет память до тех пор пока она не кончится, после этого программа аварийно завершается, так как при выделении памяти не обрабатывается ситуация, когда выделение памяти невозможно.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Это я написал лишь для примера, чтобы показать, как обращаться к перекрёстным указателям. А никто не заставляет весь код повторять точь в точь.
®B!N
Сообщения: 19
Зарегистрирован: 10 мар 2005, 20:52
Откуда: Ужгород, Украина
Контактная информация:

ссылки же можно только в конструкторе инициализировать - тоесть, пока одного объекта нету, то другой не может быть создан и наоборот. а мне надо в результате чтобы объекты этих двух классов могли меняться данными - один объект использует данные другого объекта, используя ссылку (или указатель), которую я ему назначил, так же нужно, чтобы если что, я мог поменять этот объект на другой.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Почему только в конструкторе? Можно и потом проинициализировать. Важно лишь, чтобы указатель на объект был проинициализирован до того, как к нему обратились.
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

а мне надо в результате чтобы объекты этих двух классов могли меняться данными - один объект использует данные другого объекта, используя ссылку (или указатель), которую я ему назначил, так же нужно, чтобы если что, я мог поменять этот объект на другой.
вообще то так не делается . у тебя в архитектуре проблема.
но если очень хочется (нужно) то смотри в платформ специфик вещи. в МС реализации есть понятие интерфейсов (по аналогии с явой насколько я помню)
как вариант возможно прокатит такая вещь, как создание двух родительских классов ParentA ParentB и указание их вместо конкретных твоих A B
В SAD - все в SAD.
®B!N
Сообщения: 19
Зарегистрирован: 10 мар 2005, 20:52
Откуда: Ужгород, Украина
Контактная информация:

WinMain cенкс за пример :) просто пока писал свой пост, тут много чего поприходило... :)
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

как вариант возможно прокатит такая вещь, как создание двух родительских классов ParentA ParentB и указание их вместо конкретных твоих A B
Такой вариант ещё больше затруднит решение задачи.

Лучше уж обмен данными и сообщениями через некий промежуточный класс, типа как в архитектуре "документ/вид". Сами данные находятся в одном общем классе документа, а их ввод и отображение может быть распределено между несколькими другими классами вида.
При этом каждый класс вида образован от единого базового класса и класс документа обращается к классам вида через интерфейс базового класса. Каждый класс вида имеет доступ к данным документа и при их изменении может вызывать команду на обновление других видов.
Ответить