Как избежать классов нуждающихся друг в друге?
От: Korchy  
Дата: 11.06.10 12:09
Оценка:
Подскажите, мне нужен объект, который в себе содержит список указателей на такие же объекты. Делаю следующим образом:

class SubObject;
class TransformObject {
public:
SubObject* SubObjects;
}

class SubObject {
public:
struct Sub {
TransformObject* Obj;    // Указатель на подчиненный объект
bool R;
};
// Массив подчиненных объектов
std::vector<Sub*> SubObjects;
}


Получается классы нуждаются друг в друге. Я понимаю, что это не есть гут. Подскажите пожалуйста, как можно избежать подобной ситуации?
Re: Как избежать классов нуждающихся друг в друге?
От: remark Россия http://www.1024cores.net/
Дата: 11.06.10 12:12
Оценка:
Здравствуйте, Korchy, Вы писали:

K>Подскажите, мне нужен объект, который в себе содержит список указателей на такие же объекты. Делаю следующим образом:

K>Получается классы нуждаются друг в друге. Я понимаю, что это не есть гут. Подскажите пожалуйста, как можно избежать подобной ситуации?

Возможно я не понял вопроса, но вроде как просто:
class TransformObject
{
  std::vector<TransformObject*> SubObjects;
};



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Как избежать классов нуждающихся друг в друге?
От: Korchy  
Дата: 11.06.10 12:20
Оценка:
Нет, массив нужен именно Sub т.к. там есть бинарный флаг.
Мне нужно понять как в принципе решается задача, когда в первом классе есть указатель на второй, а во втором — на первый. Чтобы не указывать перед описанием TransformObject принадлежность SubObject к классу (class SubObject.

оверквотинг и топпостинг — deleted. — Кодт
Re[3]: Как избежать классов нуждающихся друг в друге?
От: blackhearted Украина  
Дата: 11.06.10 12:22
Оценка:
Здравствуйте, Korchy, Вы писали:

K>Нет, массив нужен именно Sub т.к. там есть бинарный флаг.

K>Мне нужно понять как в принципе решается задача, когда в первом классе есть указатель на второй, а во втором — на первый. Чтобы не указывать перед описанием TransformObject принадлежность SubObject к классу (class SubObject.

Forward declaration ?
Re[4]: Как избежать классов нуждающихся друг в друге?
От: Korchy  
Дата: 11.06.10 12:38
Оценка:
так я и использую forward declaration и все компилируется. Мне хотелось бы обойтись без этого.
Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?
Re[5]: Как избежать классов нуждающихся друг в друге?
От: blackhearted Украина  
Дата: 11.06.10 12:43
Оценка:
Здравствуйте, Korchy, Вы писали:

K>так я и использую forward declaration и все компилируется. Мне хотелось бы обойтись без этого.

K>Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?


ИМХО — всё ок.
Re[3]: Как избежать классов нуждающихся друг в друге?
От: Micht  
Дата: 11.06.10 13:07
Оценка: +1
Здравствуйте, Korchy, Вы писали:

K>Мне нужно понять как в принципе решается задача, когда в первом классе есть указатель на второй, а во втором — на первый.


Например, введением интерфейса.

class ISuperPuper
{
  virtual void doSuperPuper() = 0;
}

class SuperPuperWorker : public ISuperPuper
{
  void doSuperPuper() {...}
}

class SuperPuperUser
{
  std::vector <ISuperPuper*> pupers;
}
Re[6]: Как избежать классов нуждающихся друг в друге?
От: Korchy  
Дата: 11.06.10 14:03
Оценка:
Ясно, спасибо!
Re[5]: Как избежать классов нуждающихся друг в друге?
От: Vamp Россия  
Дата: 11.06.10 14:55
Оценка:
K>Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?
Я не очень понял твою задачу, и не могу сказать, насколько оправдан данный дизайн в твоем случае, но вообще есть класс задач, истрически решаемый с применением forward declaration.
Классический пример — иерархически-связанные объекты, например:


class car;

class wheel {
public:
    car* owner;
}
...

class car {
public:
   wheel* wheel;
   break* break;
...
}
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Как избежать классов нуждающихся друг в друге?
От: Korchy  
Дата: 12.06.10 08:22
Оценка:
Да, у меня как раз этот случай, один в один.
Значит FD здесь оправдан. Спасибо!
Re[5]: Как избежать классов нуждающихся друг в друге?
От: remark Россия http://www.1024cores.net/
Дата: 15.06.10 10:33
Оценка:
Здравствуйте, Korchy, Вы писали:

K>так я и использую forward declaration и все компилируется. Мне хотелось бы обойтись без этого.

K>Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?


Если forward declaration используется для уменьшения связанности на уровне исходного кода, то тут без вопросов — нормально. Rule of thumb: можно убрать все forward declaration, и программа будет компилироваться.
Если же forward declaration используется, что бы разорвать циклические зависимости, то тут уже спорно. Циклические зависимости сами по себе не очень хорошая вещь, и в общем я бы предпочёл избавиться от циклических зависимостей в дизайне (хотя, конечно, не стоит это всегда использовать по-принципу "научи дурака богу молиться..."). Rule of thumb: без forward declaration программа не компилируется.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.