Привет всем!
Возникла проблема. Проиллюстрирую ее на следующем примере:class Base
{
public:
Base() {}
virtual ~Base() {}private:
Child m_p;
};class Child : public Base
{
public:
Child() {}
virtual ~Child() {}
};Сборка обламывается со следующим сообщением об ошибке: ‘Child’ does not name a type
Т.е. при явном использовании дочернего класса в родительском, компилятор требует объявления класса "Child" перед классом "Base", что в принципе и логично! Но класс "Child" является дочерним классом класса "Base", что в свою очередь требует объявления класса "Base" перед классом "Child"!
Предобъявление класса "Child" (class Child;) перед "Base" естественно не является решением, т.к. использование класса "Child" явное. Получается какая то рекурсия...
В принципе, я немного изменил архитектуру проекта избавившись от данной иерархии наследования, но возникшая проблема не дает мне покоя...
У кого какие будут предложения по решению этого вопроса? Или данная проблема фундаментальна?Компилятор g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
>У кого какие будут предложения по решению этого вопроса?Наймите програмиста.
>Или данная проблема фундаментальна?
Да. Проблема "создадим себе трудности, чтобы их героически преодолевать" фундаментальна и не решаема в рамках любого языка програмирования.
>У кого какие будут предложения по решению этого вопроса?Так лучше не делать. Если очень надо, то:
- перед определением класса Base добавить class Child;
- в классе Basе хранить не экземпляр класса Child, а указатель (или ссылку) на него (сооствественно понадобится конструктор, деструктор, конструктор копий и оператор присваивания определять)
Данный подход -- "Явное использование дочернего класса в родительском" -- явно противоречит идеологии объектно-ориентированного программирования и является ошибкой проектирования. Не делайте так. Нигде и никогда.
>Данный подход -- "Явное использование дочернего класса в родительском" -- явно противоречит
>идеологии объектно-ориентированного программирования и является ошибкой проектирования. Не делайте так. Нигде
>и никогда.Это ошибка здравого смысла. Обьект содержит сам себя. А тот ещё себя. ПОлучается бесконечная матрёшка )))