Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Описание классов, ссылки друг на друга


Автор: ecspertiza 14.11.2011, 12:28
Есть задача, описать два класса таким образом что бы у класс А была ссылка на класс Б и на оборот. Пробую сделать через шаблоны, следующим образом

http://liveworkspace.org/code/3a9490c197e7552b387c9e86045610da

но что то не выходит, оно и понятное дело тот класс что объявлен первым ничего не знает про второй. Как быть в такой ситуации ? Может есть какой то паттерн ?

Добавлено через 6 минут и 59 секунд
Совсем забыл про

http://liveworkspace.org/code/c11d49465c05d66af6017107e3ce338e

тему можно закрыть, спасибо

Автор: newbee 14.11.2011, 12:41
Цитата(ecspertiza @  14.11.2011,  13:28 Найти цитируемый пост)
Совсем забыл про
Если бы речь шла именно о ссылках (а не указателях), можно было бы так:
Код

class c1;
class c2;

class c1{
public:
 c1(c2 const &cc,int v):c(*const_cast<c2*>(&cc)),x(v){}
 c2 &c;
 int x;
};

class c2{
public:
 c2(c1 const &cc,int v):c(*const_cast<c1*>(&cc)),y(v){}
 c1 &c;
 int y;
};

int main(int argc,char **argv){
 c1  x(c2(x,2),1);
 c2& y=x.c;
 printf("%d %d\n",x.x,y.y);
 return 0;}

Автор: ecspertiza 14.11.2011, 12:43
да, немного не так выразился, здесь хранение указателей, но за пример все равно спасибо smile

Автор: boostcoder 14.11.2011, 13:02
не люблю я классы, которые "знают" друг о друге... самое время выявить общее, и вынести это общее в один базовый класс, который у будет предком для этих двух.

Добавлено через 13 минут и 45 секунд
Цитата(boostcoder @  14.11.2011,  13:02 Найти цитируемый пост)
который у будет предком для этих двух.

ну или они будут ссылаться на этот общий объект.

Автор: newbee 14.11.2011, 13:20
boostcoder, фу! Чрезмерное наследование, когда втупую выявляют общее, - это плохо! Это очень плохо! Композиция - вот это хорошо!

Автор: boostcoder 14.11.2011, 14:35
я больше не буду

Автор: ecspertiza 14.11.2011, 15:07
Просто нужно реализовать, взаимосвязь платформы и конфигурации. То есть платформа должна знать о поддерживаемых конфигурациях, а конфигурация о поддерживаемых платформах. Не придумал более правильного решения, но то что есть на мой взгляд, вполне подойдет.

Автор: mes 14.11.2011, 16:34
Цитата(newbee @  14.11.2011,  11:41 Найти цитируемый пост)
 c1(c2 const &cc,int v):c(*const_cast<c2*>(&cc)),x(v){}
 c2 &c;

и однажды  бааа...бах  smile 

Автор: baldina 14.11.2011, 16:43
Цитата(ecspertiza @  14.11.2011,  12:28 Найти цитируемый пост)
но что то не выходит, оно и понятное дело тот класс что объявлен первым ничего не знает про второй

дело то не в этом, просто второй класс использовался без шаблона
Цитата

error: type/value mismatch at argument 1 in template parameter list

но как только это начнешь поправлять, появится другая проблема: получается рекурсивное определение класса, размер объекта равен бесконечности. в случае шаблонов потребуется бесконечно рекурсивный шаблон, что тоже невозможно
http://liveworkspace.org/code/f57f9489dce34c0e6ea9cb4dfeb96144

Цитата(boostcoder @  14.11.2011,  13:02 Найти цитируемый пост)
не люблю я классы, которые "знают" друг о друге

 smile

Добавлено через 4 минуты и 21 секунду
Цитата(newbee @  14.11.2011,  13:20 Найти цитируемый пост)
boostcoder, фу! Чрезмерное наследование, когда втупую выявляют общее, - это плохо! Это очень плохо! Композиция - вот это хорошо! 

newbee, Ваша позиция ясна и уважаема. Но что Вы скажете про закрытое наследование? ведь это сугубо технический приём, в т.ч. когда "втупую выявляют общее"

Автор: newbee 14.11.2011, 16:47
Цитата(mes @  14.11.2011,  17:34 Найти цитируемый пост)
и однажды  бааа...бах
В данном случае это просто борьба с языком. Но при неумелом пользовании, да, бабахнет ))

Автор: newbee 14.11.2011, 17:03
Цитата(baldina @  14.11.2011,  17:43 Найти цитируемый пост)
 что Вы скажете про закрытое наследование?
Да нет, я вообще не против наследования как такового, и сама им пользуюсь. Но дело в том, что многие им слишком увлекаются, доходит до маразма: берем два объекта: палка и палец; безусловно им пресущи некоторые общие свойства, но значит ли это, что их нужно наследовать от общего (общих?) интерфейса? Не будем останавливатьяс на частных случаях вроде рисования, нам просто нужно описать эти объекты.

Автор: baldina 14.11.2011, 17:05
э-э... ну если мы будем считать и палку и палец на прочность как балочную конструкцию, то почему нет  smile 
шутка

Автор: ecspertiza 14.11.2011, 17:12
Цитата(boostcoder @  14.11.2011,  13:02 Найти цитируемый пост)
не люблю я классы, которые "знают" друг о друге


Собственно назревает вопрос почему ? и как тогда в такой ситуации быть ? Ну это так для понимания, чтоб на грабли не наступить smile

Автор: baldina 14.11.2011, 17:17
ecspertiza, в случае с указателями это нормально, ничего криминального. что бы сказать точнее, надо знать задачу

Автор: ecspertiza 14.11.2011, 17:45
Цитата(baldina @  14.11.2011,  17:17 Найти цитируемый пост)
ecspertiza, в случае с указателями это нормально, ничего криминального


Хорошо, что статьи за это дело нету smile

А задача следующая, необходимо софту обновления поставить, софт в лучшем случае состоит из двух частей, это платформа и конфигурация. При этом они связаны, то есть каждая платформа должна знать список поддерживаемых конфигураций, а каждая конфигурация список поддерживаемых платформ. Стало быть классы Config и Platform в моем случае описывают и одно и другое.  Думаю в данном случае решение нормальное, один класс содержит список указателей на объекты другого.

Автор: mes 14.11.2011, 18:55
Цитата(newbee @  14.11.2011,  15:47 Найти цитируемый пост)
 Но при неумелом пользовании, да, бабахнет )) 

Цитата(mes @  14.11.2011,  15:34 Найти цитируемый пост)
 const &cc..const_cast

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


Автор: newbee 14.11.2011, 18:57
mes, для кого писала: борьба с языком smile Там же приходится в конструктор передавать как бы временный объект, а это только через ссылку на константу. Смотри внимательно, какой финт делается в main.

Добавлено через 1 минуту и 22 секунды
Я вообще думала, такое не прокатит, и обменять два объекта ссылками друг на друга не получится smile

Автор: mes 14.11.2011, 19:36
Цитата(newbee @  14.11.2011,  17:57 Найти цитируемый пост)
для кого писала: борьба с языком

это не борьба с языком, это баабах  smile 

Цитата(newbee @  14.11.2011,  17:57 Найти цитируемый пост)
 Смотри внимательно, какой финт делается в main.

вот это как раз и бабахает..  smile 

Цитата(newbee @  14.11.2011,  17:57 Найти цитируемый пост)
, и обменять два объекта ссылками друг на друга не получится 

если для создания каждого из объектов нужна ссылка на созданный экземпляр другого, то это даже логически непредставимо..
 smile 
что впрочем не мешает одному создвать/хранить другой и инициализировать его ссылкой на себя..

Добавлено @ 19:38
Цитата(newbee @  14.11.2011,  17:57 Найти цитируемый пост)
Я вообще думала, такое не прокатит, и обменять два объекта ссылками друг на друга не получится 

и не получилось.. на самом деле хранимая ссылка  не валидна и она как раз и является причиной упомянотой уже не раз неприятной ситуации с вынужденной дальнейшей отладкой.. 

Автор: newbee 14.11.2011, 20:23
mes, возможно ты прав. Перед ответом посмотрела выхлоп valgrind, он проблем не нашел. Может быть, потому что все на стеке main-а...

Автор: mes 14.11.2011, 21:35
Цитата(newbee @  14.11.2011,  19:23 Найти цитируемый пост)
, возможно

http://liveworkspace.org/code/58a595f00af4226b8725967ab86409c2

Автор: baldina 14.11.2011, 23:09
Цитата(ecspertiza @  14.11.2011,  17:45 Найти цитируемый пост)
они связаны, то есть каждая платформа должна знать список поддерживаемых конфигураций, а каждая конфигурация список поддерживаемых платформ

значит все ок

Автор: newbee 14.11.2011, 23:30
mes, ок, я дала дурацкий совет smile

Автор: Lols 15.11.2011, 03:30
А чем, все-таки, не понравился ответ автора поста? smile

Автор: baldina 15.11.2011, 15:31
 smile Lols, что за манера ходить по разным веткам форума и оставлять ничего не значащие сообщения?

Автор: cupper 28.11.2011, 11:23
Цитата(ecspertiza @ 14.11.2011,  17:45)
каждая платформа должна знать список поддерживаемых конфигураций, а каждая конфигурация список поддерживаемых платформ

А вы уверены что вам нужен велосипед который умеет одинаково хорошо ездить как вперед так и назад ?
Может быть стоит сделать одну сущность главной а вторую придаточной ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)