Здравствуйте, Korchy, Вы писали:
K>Подскажите, мне нужен объект, который в себе содержит список указателей на такие же объекты. Делаю следующим образом: K>Получается классы нуждаются друг в друге. Я понимаю, что это не есть гут. Подскажите пожалуйста, как можно избежать подобной ситуации?
Возможно я не понял вопроса, но вроде как просто:
class TransformObject
{
std::vector<TransformObject*> SubObjects;
};
Нет, массив нужен именно Sub т.к. там есть бинарный флаг.
Мне нужно понять как в принципе решается задача, когда в первом классе есть указатель на второй, а во втором — на первый. Чтобы не указывать перед описанием TransformObject принадлежность SubObject к классу (class SubObject.
оверквотинг и топпостинг — deleted. — Кодт
Re[3]: Как избежать классов нуждающихся друг в друге?
Здравствуйте, Korchy, Вы писали:
K>Нет, массив нужен именно Sub т.к. там есть бинарный флаг. K>Мне нужно понять как в принципе решается задача, когда в первом классе есть указатель на второй, а во втором — на первый. Чтобы не указывать перед описанием TransformObject принадлежность SubObject к классу (class SubObject.
Forward declaration ?
Re[4]: Как избежать классов нуждающихся друг в друге?
так я и использую forward declaration и все компилируется. Мне хотелось бы обойтись без этого.
Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?
Re[5]: Как избежать классов нуждающихся друг в друге?
Здравствуйте, Korchy, Вы писали:
K>так я и использую forward declaration и все компилируется. Мне хотелось бы обойтись без этого. K>Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?
ИМХО — всё ок.
Re[3]: Как избежать классов нуждающихся друг в друге?
Здравствуйте, Korchy, Вы писали:
K>Мне нужно понять как в принципе решается задача, когда в первом классе есть указатель на второй, а во втором — на первый.
Например, введением интерфейса.
class ISuperPuper
{
virtual void doSuperPuper() = 0;
}
class SuperPuperWorker : public ISuperPuper
{
void doSuperPuper() {...}
}
class SuperPuperUser
{
std::vector <ISuperPuper*> pupers;
}
Re[6]: Как избежать классов нуждающихся друг в друге?
K>Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?
Я не очень понял твою задачу, и не могу сказать, насколько оправдан данный дизайн в твоем случае, но вообще есть класс задач, истрически решаемый с применением forward declaration.
Классический пример — иерархически-связанные объекты, например:
class car;
class wheel {
public:
car* owner;
}
...
class car {
public:
wheel* wheel;
break* break;
...
}
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Как избежать классов нуждающихся друг в друге?
Здравствуйте, Korchy, Вы писали:
K>так я и использую forward declaration и все компилируется. Мне хотелось бы обойтись без этого. K>Или, может я просто не понимаю, использование подхода в написании программа, где нужна forward declaration, это нормально и естесвенно? Или все же нужно строить структуру программы так, чтобы обходится без forward declaration?
Если forward declaration используется для уменьшения связанности на уровне исходного кода, то тут без вопросов — нормально. Rule of thumb: можно убрать все forward declaration, и программа будет компилироваться.
Если же forward declaration используется, что бы разорвать циклические зависимости, то тут уже спорно. Циклические зависимости сами по себе не очень хорошая вещь, и в общем я бы предпочёл избавиться от циклических зависимостей в дизайне (хотя, конечно, не стоит это всегда использовать по-принципу "научи дурака богу молиться..."). Rule of thumb: без forward declaration программа не компилируется.