Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> доступ к закрытым данным класса 
:(
    Опции темы
zss
Дата 19.1.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



есть чисто виртуальный класс
Код
class Base{
  virtual f(...) const = 0;
};


есть некие классы с данными
Код
class Ai {
private :
  // здесь данные
};


и наконец общий класс, являющийся вектором А
Код
class Result : std::vector <A> {
private :
  Base *base_;

public:
  Result (const Base& base) : base_ (&base){...}
}


которому передается ссылка на базовый класс Base.

1.Так вот - как можно (и можно ли вообще) получить из классов, унаследованных от Base получить доступ к данным классов Ai и Result.
2. Внутри Result есть указатель на базовый класс Base. Но мне нужна
копия этого класса. Если создавать класс, то не понятно какой класс
(я про его наследников)

Как правильно это сделать ?
PM MAIL ICQ   Вверх
azesmcar
Дата 19.1.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Брррррррррр,

Нихрена не понял...
кто от кого наследует..кто такой Ai, кто такой А???
Я что-то ни одного наследника Base не вижу...где переопределенная функция f()?
Какую ссылку получает твой конструктор копирования? Если можно поподробней...и где вообще обявление класса A?
PM   Вверх
np9mi7
Дата 19.1.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
которому передается ссылка на базовый класс Base.

1.Так вот - как можно (и можно ли вообще) получить из классов, унаследованных от Base получить доступ к данным классов Ai и Result.
2. Внутри Result есть указатель на базовый класс Base. Но мне нужна
копия этого класса. Если создавать класс, то не понятно какой класс
(я про его наследников)

Как правильно это сделать ?
, вот это каша... ПРОЕКТИРУЙ НОРМАЛЬНО, ТОГДА ТАКИХ ПРОБЛЕМ НЕ БУДЕТ!!!

class Result : std::vector <A> - так нельзя, поскольку std::vector не предназначен для этого;


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
zss
Дата 19.1.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(azesmcar @ 19.1.2006, 11:12 Найти цитируемый пост)

кто такой Ai

это просто класс с закрытыми данными, к которым и нужен доступ

Цитата(azesmcar @ 19.1.2006, 11:12 Найти цитируемый пост)

кто такой А

это класс-вектор Ai

Цитата(azesmcar @ 19.1.2006, 11:12 Найти цитируемый пост)

Я что-то ни одного наследника Base не вижу...где переопределенная функция f()?


да это любой класс, унаследованный от Base. Только передается ссылка на базовый класс (я не стал писать лишнего smile)

Цитата(azesmcar @ 19.1.2006, 11:12 Найти цитируемый пост)

Если можно поподробней...и где вообще обявление класса A?

я просто показал, что внутри А мне нужно хранить копию объекта,
унаследованного от Base. А как это сделать - пока не понятно

PM MAIL ICQ   Вверх
azesmcar
Дата 19.1.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Начнем с того что
Цитата

Result (const Base& base) : base_ (&base){...}

работать не станет...потому что base класс абстрактный, на него можно передавать только указатель...
и не в коем случае не обьект и не ссылку на обьект, потому что обьекта как такового быть не может...

Цитата

это класс-вектор Ai


реализацию в студию...что значит класс-вектор???
а получить обьект child из указателья base динамически можно с помощю dynamic_cast<child*>(base_)

покажи обявление класса A
PM   Вверх
np9mi7
  Дата 19.1.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Копию абстрактного типа можно создать так:
Код

class CAbstract
{
public:
    virtual CAbstract * Clone () const = 0;
};

class CChild : public CAbstract
{
public:
    virtual CAbstract * Clone () const
    {
        return new CChild ( * this);
    }
};


Для получения данных создай метод:
Код

class CSome
{
    unsigned int m_uiPrivateValue;
public:
    unsigned int get_private_value () const
    {
        m_uiPrivateValue;
    }
};

Для редактирования данных создай метод:
Код
class CSome
{
    unsigned int m_uiPrivateValue;
public:
    unsigned int get_private_value () const
    {
        m_uiPrivateValue;
    }
    
    void set_private_value (const unsigned int uiPrivateValue)
    {
        m_uiPrivateValue = uiPrivateValue;
    }    
};


Это сообщение отредактировал(а) np9mi7 - 19.1.2006, 12:11


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
zss
Дата 19.1.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(azesmcar @ 19.1.2006, 11:42 Найти цитируемый пост)

реализацию в студию...что значит класс-вектор???

это значит
Код

class VecClass : private std::vector <SomeClass>


Цитата(azesmcar @ 19.1.2006, 11:42 Найти цитируемый пост)

а получить обьект child из указателья base динамически можно с помощю dynamic_cast<child*>(base_)

а откуда я знаю что это за наследник ?

хорошо - попорядку smile

1.есть класс с закрытыми данными PrClass, который создает внутри поток и складывает
в свою очередь данные (пусть для наглядности это будет очередь int-ов 1,2,3...)

Этих классов несколько

2. Есть класс-вектор, который содержит эти классы
Код

class VecClass : private std::vector<PrClass>{
};


3. Внутри VecClass запускается еще один поток, который обрабатывает очереди классов
PrClass. Но как их обрабатывать знает только класс ExClass (это чисто виртуальный
класс с определенным интерфейсом)
Код

class ExClass {
virtual method 1(...) = 0;
virtual method 2(...) = 0;
virtual method 3(...) = 0;
...
}


так вод тогда достаточно будет унаследоваться от ExClass, определить виртуальные методы и отдать его VecClass, который в потоке будет дергать методы ExClass.
Тогда обработка очередей будет зависить от только от разработчика наследника ExClass.

Но !!!
1. классы PrClass вспомагательные (у них закрыты конструкторы и деструкторы). Их может создавать только класс-вектор VecClass. Поэтому встает вопрос доступа к из
закрытым данным
2. Внутри VecClass нужно хранить копию объекта унаследованного от ExClass.
т.к. это астрактный класс, то хранить получается только указатель на базовый класс.
Но тогда как создать копию его наследника ?


Надеюсь понятно объяснил smile
PM MAIL ICQ   Вверх
pablo
Дата 19.1.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6




Цитата

.Так вот - как можно (и можно ли вообще) получить из классов, унаследованных от Base получить доступ к данным классов Ai и Result.
2. Внутри Result есть указатель на базовый класс Base. Но мне нужна
копия этого класса. Если создавать класс, то не понятно какой класс
(я про его наследников)


Может было бы разумно выразить вопросс в более удобоваримом виде ?


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
pablo
Дата 19.1.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



А не проще будет просто VecClass унаследовать от ExClass и внутри определить методы обаботки (Если я правельно понял конечно)?


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
zss
Дата 19.1.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(pablo @ 19.1.2006, 12:23 Найти цитируемый пост)

А не проще будет просто VecClass унаследовать от ExClass и внутри определить методы обаботки (Если я правельно понял конечно)?


нет - ExClass должен иметь возможность переопределения виртуальных функций

PM MAIL ICQ   Вверх
pablo
Дата 19.1.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Цитата

Но как их обрабатывать знает только класс ExClass (это чисто виртуальный
класс с определенным интерфейсом)


Цитата

ExClass должен иметь возможность переопределения виртуальных функций


Противоречие в определении !

На мой взгляд, решение простое - отказатся от абстрактного класса ExClass.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
azesmcar
Дата 19.1.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

class Result : std::vector <A> {
private :
  Base *base_;

public:
  Result (const Base& base) : base_ (&base){...}
}


Начнем сначала...
Во первых убираем ссылку и ставим указатель...
Во вторых, нам надо в конструкторе понять какой именно обьект был передан, верно?
Можно сделать по разному...
Код

if ( dynamic_cast<CMyChild1*>(base) )
{
   //тогда CMyChild1
} else
if ( dynamic_cast<CMyChild2*>(base) )
{
   //тогда CMyChild2
}
// ... и.т.д.


но мне больше нравиться с помощью template классов
Код

template <class T>
Result::Result (const T *pObject)
{
   T* pNewObj = new T;
   *pNewObj = pObject;
   base = pNewObj;
}

А для доступа подружи классы...

Подходит вариант?

Это сообщение отредактировал(а) azesmcar - 19.1.2006, 14:02
PM   Вверх
zss
Дата 19.1.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 708
Регистрация: 17.6.2004

Репутация: 1
Всего: 2



Цитата(azesmcar @ 19.1.2006, 13:57 Найти цитируемый пост)

if ( dynamic_cast<CMyChild1*>(base) )
{
  //тогда CMyChild1
} else
if ( dynamic_cast<CMyChild2*>(base) )
{
  //тогда CMyChild2
}


а если я отдам класс и на его основе кто-то унаследуется.
Я же не предсказатель какой это наследник, поэтому
dynamic_cast не подойдет

Цитата(azesmcar @ 19.1.2006, 13:57 Найти цитируемый пост)

template <class T>
Result::Result (const T *pObject)
{
  T* pNewObj = new T;
  *pNewObj = pObject;
  base = pNewObj;
}


я думаю, что с Clone() все проще и нагляднее smile

PM MAIL ICQ   Вверх
Vyacheslav
Дата 19.1.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(azesmcar @ 19.1.2006, 13:57 Найти цитируемый пост)

Начнем сначала...
Во первых убираем ссылку и ставим указатель...

А зачем? Чем ссылка хуже указателя в данном случае? Полиморфизм распроcтраняется не только на указатели, но и на ссылки.

Более того, можно сделать и так
Код

class Result : std::vector <A> {
private :
  Base& base_;

public:
  Result ( Base& base ) : base_ (base){...}
}


И абстрактность класса здесь не причем, поскольку никакого объекта класса Base не создаем

Код


class Derived : public Base {
public:
    f(){} 
}

...
Derived derived;
Result result(derived);




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 19.1.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



По теме. Ставим задачу
Есть три класса A, B, C. Нужно чтобы класс A и его наследники получили доступ к закрытым члена классов B и С.
Шаг первый. Делаем класс A другом B и С, и первую задачу( класс А получил доступ к закрытым членам) выполнили. К сожалению дружественность не наследуется, поэтому
Шаг второй. Добавляем в A protected медоды, которые будут принимать в качестве параметра экземпляры классов и возвращать ссылки(указатели) на нужные нам закрытые поля. Вторая часть задачи выполнена.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.