информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медСтрашный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] Нескромный вопрос 20.02.03 17:48  Число просмотров: 1025
Автор: 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