информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на InternetГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 ФБР нашла русский след в атаках... 
 Массовый взлом SharePoint 
 Microsoft Authenticator прекращает... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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
<"чистая" ссылка>
> Последняя модная фишка - вообще, не создавать екземпляров
> класса (объектов), а делать всё в статике.
В частности, для абстрактных классов на этапе компиляции не всегда известна не только потребность в конкретном объекте, но даже и его тип. Здесь уж как ни изворачивайся, а статически его создать не получится :-)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach