Re: Pure перекрестные ссылки
От: Klestov  
Дата: 17.11.02 15:09
Оценка: -2
Здравствуйте, Михаил1981, Вы писали:

Избыточное цитирование удалено модератором. -- ПК

М>//a1 Должен инициализироваться указателем на b1

М>//b1 Должен инициализироваться указателем на a1

Объекты класса A должна инициализироватся не в конструкторе — назовем ее отложенная инициализация.

A a1;
B b1(&a1);
a1.Initialize(&b1);
Re[3]: Pure перекрестные ссылки
От: Klestov  
Дата: 17.11.02 16:51
Оценка: -1
Здравствуйте, Anton V. Kolotaev, Вы писали:

AVK>Здравствуйте, Klestov, Вы писали:


K>>Объекты класса A должна инициализироватся не в конструкторе — назовем ее отложенная инициализация.


AVK>Это не совсем интересно, поскольку рекомендуется как можно больше инициализации переносить в конструктор, усиляя таким образом инвариант класса. Например, в приведенном выше примере объекты типов A и B могли содержать константные указатели или ссылки друг на друга, что требовало их инициалиции именно в констукторе, а точнее в списке инициализации.


Интересно — не интересно это не технические понятия НО — исходя из всего сказанного на тему у меня возникает ВОПРОС если классы так тесно связаны не я вляется ли это признаком декомпозиции некоего класса описавающего сущность и не есть ли эта ситуация ошибкой проектирования !?
Может не следует идти на поводу о 2-х классах а стоит перепроектировать систему т.к. в ней явно прослеживается концептуальный дефект ?
Re[5]: Pure перекрестные ссылки
От: Klestov  
Дата: 17.11.02 17:28
Оценка: -1
Избыточное цитирование удалено модератором. -- ПК

Здравствуйте, Anton V. Kolotaev, Вы писали:

AVK>Ну так мы и нетехнари.


Да да — мы творческая интеллигенция, а программирование это всего лиш искуство например как фигурная лепка из пластилина в слепую для детей с задержанным развитием речи

AVK>Что плохого в следующем коде? (за исключением возможности схватить pure virtual call)


Этот присер не показателен и только косвенно касается данной темы
Re[7]: Тема базара ....
От: Klestov  
Дата: 17.11.02 17:45
Оценка: -1
Избыточное цитирование удалено модератором. -- ПК

Здравствуйте, Anton V. Kolotaev, Вы писали:

AVK>Я привел пример естественного дизайна, при котором возникают перекрестные ссылки. Обвинение в плохом дизайне несостоятельно.


Может быть я не достаточно ясно выразил свою мысль в предыдущих постах но мой замечание относилось не только в отношении перекрестной ссылки но и того что при этом функциональность объектов тесно связана – возможно требуется создать агрегирующий класс или просто объединить классы в один.

Pure перекрестные ссылки
От: Михаил1981  
Дата: 16.11.02 19:55
Оценка:
Привет, Алл!

Как сделать следующее:

struct B;

struct A
{
B *pA;
};

struct B
{
A *pA;
};

//и теперь самое главное!

A a1;
B b1;

//a1 Должен инициализироваться указателем на b1
//b1 Должен инициализироваться указателем на a1
---------------------------------------------------
то есть должно получиться что-то похожее на
A a1(&b1);
B b1(&a1);
Ясно что можно инициализировать ручками во время выполнения программы, но хочется чтобы сам компилятор выполнил связывание...

Михаил
Re: Pure перекрестные ссылки
От: TepMuHyc  
Дата: 16.11.02 20:01
Оценка:
М>Ясно что можно инициализировать ручками во время выполнения программы, но хочется чтобы сам компилятор выполнил связывание...

...А не обьяснишь ты мне тупому откуда возьмутся величины для инициализации ?
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re: Pure перекрестные ссылки
От: Andrew S Россия http://alchemy-lab.com
Дата: 16.11.02 20:02
Оценка:
Адрес экземпляра класса B неизвестен до его конструирования на стеке, как и адрес экземпляра класса А. Придется ручками. Иначе,наверное, никак. Единственное, что можно b1={&a1};

Успехов.

М>A a1;

М>B b1;

М>//a1 Должен инициализироваться указателем на b1

М>//b1 Должен инициализироваться указателем на a1
М>---------------------------------------------------
М>то есть должно получиться что-то похожее на
М>A a1(&b1);
М>B b1(&a1);
М>Ясно что можно инициализировать ручками во время выполнения программы, но хочется чтобы сам компилятор выполнил связывание...

М>Михаил
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Pure перекрестные ссылки
От: Anton V. Kolotaev  
Дата: 17.11.02 12:41
Оценка:
Здравствуйте, Михаил1981, Вы писали:

М>Ясно что можно инициализировать ручками во время выполнения программы, но хочется чтобы сам компилятор выполнил связывание...


Обычный применяемый в таких случаях ход — завести для этих двух классов структуру, их содержащую и в конструкторе проставляющая ссылки друг на друга:

struct AB {
   A   a;
   B   b;
   AB () { a.p = &b; b.p = &a; }
};

void f () {
   AB  ab;   // указатели проинициализируются...
   A&  a = ab.a;
   B&  b = ab.b; 
   //  дальше пишешь то, что хотел написать.
}


Если в конструкторах A и B вызываются виртуальные методы друг друга, можно схлопотать pure virtual call.
Структуру можно сделать локальной.
Re[2]: Pure перекрестные ссылки
От: Anton V. Kolotaev  
Дата: 17.11.02 15:15
Оценка:
Здравствуйте, Klestov, Вы писали:

K>Объекты класса A должна инициализироватся не в конструкторе — назовем ее отложенная инициализация.


Это не совсем интересно, поскольку рекомендуется как можно больше инициализации переносить в конструктор, усиляя таким образом инвариант класса. Например, в приведенном выше примере объекты типов A и B могли содержать константные указатели или ссылки друг на друга, что требовало их инициалиции именно в констукторе, а точнее в списке инициализации.
Re: Pure перекрестные ссылки
От: Рек Россия  
Дата: 17.11.02 15:40
Оценка:
Если классы так уж тесно связаны, то можно
вложить один из них в другой... вот так например:


struct A;
struct B
{
    B(A* pa): pA(pa){}
    A* pA;
    void f() {cout << "F" << endl; }
};

struct A
{
    A () : b(this){} // сдесь может ругаться.
    operator B& () { return b; }
    B b;
    void g() {cout << "G" << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    B& b = a; // B как бы не самостоятельный... ну и что?
              // Важно то, что они инициализируются одновременно.
              // т.е. когда доступен а тогда достепен и в. 

    b.f(); // ((B&)a).f();
    a.g();

    getch();    
    return 0;
}
Re[4]: Pure перекрестные ссылки
От: Anton V. Kolotaev  
Дата: 17.11.02 17:14
Оценка:
Здравствуйте, Klestov, Вы писали:

K>Интересно — не интересно это не технические понятия


Ну так мы и нетехнари.

K>НО — исходя из всего сказанного на тему у меня возникает ВОПРОС если классы так тесно связаны не я вляется ли это признаком декомпозиции некоего класса описавающего сущность и не есть ли эта ситуация ошибкой проектирования !?

K>Может не следует идти на поводу о 2-х классах а стоит перепроектировать систему т.к. в ней явно прослеживается концептуальный дефект ?

Я не думаю, что появление перекрестных ссылок — признак плохого дизайна. Когда я старался придерживаться "чистого" ООП, они иногда возникали, и я не могу сказать, что это плохо.

Что плохого в следующем коде? (за исключением возможности схватить pure virtual call)

struct IA
{
  //....
};

struct IB
{
  //....
};

class CA : public IA
{
    IB   &_ib;
public:
    CA (IB &ib) : _ib(ib) {}
   // ....
};

class CB : public IB
{
    IA   &_ia;
public:
    CB (IA &ia) : _ia(ia) {}
   // ....
};

class Facade
{
    CA   _ca;
    CB   _cb;
public:
    Facade () : _ca (_cb), _cb (_ca) {}
    //...
};


Интерфейсы IA и IB независимы. То, что CA выражен в терминах IB, CB не знает. Наоборот тоже верно. CA и CB тоже ничего друг о друге не знают. Что плохого в том, что они оказались подходящими кандидатами для удовлетворения функциональности друг друга?
Re[6]: НЕ ОВЕРКВОТЬ!!!
От: Anton V. Kolotaev  
Дата: 17.11.02 17:38
Оценка:
Здравствуйте, Klestov, Вы писали:

K>Этот присер не показателен и только косвенно касается данной темы


Я привел пример естественного дизайна, при котором возникают перекрестные ссылки. Обвинение в плохом дизайне несостоятельно.

ЗЫ. Не оверквоть.
Re[8]: Тема базара ....
От: Klestov  
Дата: 17.11.02 17:47
Оценка:
Здравствуйте, Klestov, Вы писали:

Упс — сори за синтакс еггог "постах но мой замечание" — "постах но мое замечание"

Избыточное цитирование удалено модератором. -- ПК
Re[2]: Pure перекрестные ссылки
От: Михаил1981  
Дата: 17.11.02 18:01
Оценка:
TMH>...А не обьяснишь ты мне тупому откуда возьмутся величины для инициализации ?
Легко — сгененируются моей программой
Re: Pure перекрестные ссылки
От: Михаил1981  
Дата: 17.11.02 18:10
Оценка:
Господа, всем спасибо за ответы!

Решение найдено!!!

достаточно к первому объявлению добавить extern...
а это уже делает из него декларирование.
То есть
extern B b1;
A a1(&b1);
B b1(&a1);

Михаил
Re[2]: Pure перекрестные ссылки
От: WolfHound  
Дата: 17.11.02 18:16
Оценка:
Здравствуйте Klestov, Вы писали:

Ноль за оверквотинг.

ЗЫ Всех оверквотеров нулями закидаю. Призывю присоединиться!
... << RSDN@Home 1.0 alpha 12 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Pure перекрестные ссылки
От: Andrew S Россия http://alchemy-lab.com
Дата: 17.11.02 19:48
Оценка:
Нулями закидать много ума не надо. Сначала попробуй просто указать человеку на правила форума... А вот если не понимает — тогда конечно. Но тут я с тобой согласен — есть за что.

WH>Ноль за оверквотинг.


WH>ЗЫ Всех оверквотеров нулями закидаю. Призывю присоединиться!
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.