Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
[C++] Нескромный вопрос 20.02.03 17:48 Число просмотров: 1035
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
Ты с ООП когда познакомился? Чур не обижаться.
|
<programming>
|
[C++] Проблема с классами - кросс-ссылки при объявлении и наследование 20.02.03 17:22
Автор: BXS Статус: Незарегистрированный пользователь
|
Как создать наследуемый класс так, чтобы
а) наследуемый получил доступ к инициализированным структурам и членам родительского класса и
б) базовый класс создал бы наследуемый и сохранил бы указатель на него у себя в private?
идеально было бы:
class CBase{
public:
CBase();
void Func();
private:
CDerived *pDerived;
};
и
class CDerived: public CBase{
public:
CDerived();
};
и создать наследуемый класс в функции CBase::Func(){pDerived = new CDerived;...}
Но такая конструкция не компилится, поскольку оба класса ссылаются друг на друга при объявлении.
И как сделать так, чтобы вновь созданный наследуемый класс имел доступ к инициализированным данным базового, или это невозможно?
помогите, пожалуйста.
заранее спасибо
|
 |
Синтаксис позволяет 20.02.03 18:31
Автор: PS <PS> Статус: Elderman
|
class BBB;
class AAA
{
BBB* a;
};
class BBB: public AAA
{
};
<\pre>
|
 |  |
И вторая часть вопроса 20.02.03 19:20
Автор: amirul <Serge> Статус: The Elderman
|
Чтоб базовый имел доступ к членам производного можно его сделать дружественным:
> > class BBB;
>
> class AAA
> {
> BBB* a;
friend class BBB;
> };
>
> class BBB: public AAA
> {
> };
> ---
Только надо ли?
|
 |
[C++] Нескромный вопрос 20.02.03 17:48
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
Ты с ООП когда познакомился? Чур не обижаться.
|
 |
[C++] Не нравится мне это... 20.02.03 17:43
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 20.02.03 17:46 Количество правок: 2
|
Честно говоря, у меня создается ощущение, что ты неправильно используешь наследование. Ты уверен, что твой случай требует именно _наследования_?
Быстрое решение такое: перед определением class CBase ставишь строчку
class CDerived;
Все. НО! Советую трижды подумать перед тем, как это делать. У тебя базовый класс завязан на производный - это не слишком хорошая идея. Не имеет ли смысла перепроектировать иерархию так, чтобы зависимости шли только в одну сторону (т.е. чтобы ссылки шли либо на свой класс, либо на свои базовые классы)?
> И как сделать так, чтобы вновь созданный наследуемый класс > имел доступ к инициализированным данным базового, или это > невозможно? Классы в С++ _не создаются_. В С++ создаются объекты. Разница, надеюсь, понятна? Теоретически сделать это можно, но я даже не буду рассказывать как, пока ты не убедишь меня, что это действительно единственный выход из положения.
|
 |  |
[C++] Поддерживаю 20.02.03 19:17
Автор: amirul <Serge> Статус: The Elderman
|
> Все. НО! Советую трижды подумать перед тем, как это делать. > У тебя базовый класс завязан на производный - это не > слишком хорошая идея. Не имеет ли смысла перепроектировать > иерархию так, чтобы зависимости шли только в одну сторону > (т.е. чтобы ссылки шли либо на свой класс, либо на свои > базовые классы)? Не должны базовые классы знать о производных. Даже изменение protected-членов из виртуальных функций есть очень плохо, а уж тем более хранение указателя на производный в базовом
> Классы в С++ _не создаются_. В С++ создаются объекты. Иногда создаются (инстанцируются :-))) ), но это другая история
> Разница, надеюсь, понятна? Теоретически сделать это можно, > но я даже не буду рассказывать как, пока ты не убедишь > меня, что это действительно единственный выход из > положения. Я тоже не верю, что это МОЖЕТ понадобиться
|
 |  |  |
[C++] Не в тему... 21.02.03 11:38
Автор: Green Статус: Незарегистрированный пользователь
|
> > Классы в С++ _не создаются_. В С++ создаются объекты. > Иногда создаются (инстанцируются :-))) ), но это другая > история
Последняя модная фишка - вообще, не создавать екземпляров класса (объектов), а делать всё в статике.
|
 |  |  |  |
[C++] Это не всегда возможно 21.02.03 12:40
Автор: amirul <Serge> Статус: The Elderman
|
> Последняя модная фишка - вообще, не создавать екземпляров > класса (объектов), а делать всё в статике. В частности, для абстрактных классов на этапе компиляции не всегда известна не только потребность в конкретном объекте, но даже и его тип. Здесь уж как ни изворачивайся, а статически его создать не получится :-)
|
|
|