![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| zss |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
есть чисто виртуальный класс
есть некие классы с данными
и наконец общий класс, являющийся вектором А
которому передается ссылка на базовый класс Base. 1.Так вот - как можно (и можно ли вообще) получить из классов, унаследованных от Base получить доступ к данным классов Ai и Result. 2. Внутри Result есть указатель на базовый класс Base. Но мне нужна копия этого класса. Если создавать класс, то не понятно какой класс (я про его наследников) Как правильно это сделать ? |
||||||
|
|||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Брррррррррр,
Нихрена не понял... кто от кого наследует..кто такой Ai, кто такой А??? Я что-то ни одного наследника Base не вижу...где переопределенная функция f()? Какую ссылку получает твой конструктор копирования? Если можно поподробней...и где вообще обявление класса A? |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
class Result : std::vector <A> - так нельзя, поскольку std::vector не предназначен для этого; |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
это просто класс с закрытыми данными, к которым и нужен доступ это класс-вектор Ai
да это любой класс, унаследованный от Base. Только передается ссылка на базовый класс (я не стал писать лишнего я просто показал, что внутри А мне нужно хранить копию объекта, унаследованного от Base. А как это сделать - пока не понятно |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Начнем с того что
работать не станет...потому что base класс абстрактный, на него можно передавать только указатель... и не в коем случае не обьект и не ссылку на обьект, потому что обьекта как такового быть не может...
реализацию в студию...что значит класс-вектор??? а получить обьект child из указателья base динамически можно с помощю dynamic_cast<child*>(base_) покажи обявление класса A |
||||
|
|||||
| np9mi7 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Копию абстрактного типа можно создать так:
Для получения данных создай метод:
Для редактирования данных создай метод:
Это сообщение отредактировал(а) np9mi7 - 19.1.2006, 12:11 |
||||||
|
|||||||
| zss |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
это значит
а откуда я знаю что это за наследник ? хорошо - попорядку 1.есть класс с закрытыми данными PrClass, который создает внутри поток и складывает в свою очередь данные (пусть для наглядности это будет очередь int-ов 1,2,3...) Этих классов несколько 2. Есть класс-вектор, который содержит эти классы
3. Внутри VecClass запускается еще один поток, который обрабатывает очереди классов PrClass. Но как их обрабатывать знает только класс ExClass (это чисто виртуальный класс с определенным интерфейсом)
так вод тогда достаточно будет унаследоваться от ExClass, определить виртуальные методы и отдать его VecClass, который в потоке будет дергать методы ExClass. Тогда обработка очередей будет зависить от только от разработчика наследника ExClass. Но !!! 1. классы PrClass вспомагательные (у них закрыты конструкторы и деструкторы). Их может создавать только класс-вектор VecClass. Поэтому встает вопрос доступа к из закрытым данным 2. Внутри VecClass нужно хранить копию объекта унаследованного от ExClass. т.к. это астрактный класс, то хранить получается только указатель на базовый класс. Но тогда как создать копию его наследника ? Надеюсь понятно объяснил |
||||||||
|
|||||||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Может было бы разумно выразить вопросс в более удобоваримом виде ? -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
А не проще будет просто VecClass унаследовать от ExClass и внутри определить методы обаботки (Если я правельно понял конечно)?
-------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
||||
|
||||
| pablo |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Противоречие в определении ! На мой взгляд, решение простое - отказатся от абстрактного класса ExClass. -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
||||
|
|||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Начнем сначала... Во первых убираем ссылку и ставим указатель... Во вторых, нам надо в конструкторе понять какой именно обьект был передан, верно? Можно сделать по разному...
но мне больше нравиться с помощью template классов
А для доступа подружи классы... Подходит вариант? Это сообщение отредактировал(а) azesmcar - 19.1.2006, 14:02 |
||||||
|
|||||||
| zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
а если я отдам класс и на его основе кто-то унаследуется. Я же не предсказатель какой это наследник, поэтому dynamic_cast не подойдет
я думаю, что с Clone() все проще и нагляднее |
||||
|
|||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
А зачем? Чем ссылка хуже указателя в данном случае? Полиморфизм распроcтраняется не только на указатели, но и на ссылки. Более того, можно сделать и так
И абстрактность класса здесь не причем, поскольку никакого объекта класса Base не создаем
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
По теме. Ставим задачу
Есть три класса A, B, C. Нужно чтобы класс A и его наследники получили доступ к закрытым члена классов B и С. Шаг первый. Делаем класс A другом B и С, и первую задачу( класс А получил доступ к закрытым членам) выполнили. К сожалению дружественность не наследуется, поэтому Шаг второй. Добавляем в A protected медоды, которые будут принимать в качестве параметра экземпляры классов и возвращать ссылки(указатели) на нужные нам закрытые поля. Вторая часть задачи выполнена. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |