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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к защищенному свойству объекта 
V
    Опции темы
wallstreet
Дата 15.7.2015, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет.
Как можно получить доступ дочернему классу А к защищенному свойству базового класса?

Код

#include <iostream>

/*Базовый класс*/
class Base
{
protected:
    int a;
public:
    void aInit(int i){a = i;}
}

/*Производынй класс*/
class A : public Base
{
public:
    void aUsage(Base& b)
    {
        b.a = 3; /*Error: protected member "Base::a" is not accessible throught "Base" pointer or object*/
    }
}

int main(int argv, char** argc)
{

    Base b;
    b.aInit(5);

    A a;
    a.aUsage(b);

    return 0;
}

PM MAIL   Вверх
Alexeis
Дата 16.7.2015, 09:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Это отношения 2х объектов, а не части и целого. В этом случае наследование не помогает. Можно зафрендить классы (friend), тогда объекты смогут лазить друг к другу, но это плохой способ написания кода. В ООП не принято менять свойства другого объект напрямую. Только через посылку сообщения (вызов функции) . Френды используются когда строиться композиционная логика. Т.е. некоторые объекты не являются самостоятельной сущностью, а служат для дополнения логики некоторого главного объекта, тогда эти вспомогательные объекты будут ему друзьями. К дополнению через наследование это не относится.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
wallstreet
Дата 16.7.2015, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, Alexeis 

у меня задача такая:
1. Есть текстовый файл с данными
2. Есть алгоритм анализа этих данных.

Отсюда следует, что необходимо эти данные: 1) распарсить, 2) разложить по контейнерам для дальнейшего, более удобного доступа к ним и в итоге 3) проанализировать и 4) сделать вывод.
В моем случае класс Base занимается 1) и 2) пунктами и переменная "а" это ничто иное как контейнер с распарсеными данными.  В классе A прописаны методы анализа, т.е. занимается пунктом 3) из задачи, именно поэтому ему нужен доступ к контейнеру с данными.

Подскажите, какую объектную модель было бы правильнее реализовать в моем случае?
PM MAIL   Вверх
Alexeis
Дата 16.7.2015, 13:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(wallstreet @  16.7.2015,  12:42 Найти цитируемый пост)
 В классе A прописаны методы анализа, т.е. занимается пунктом 3) из задачи, именно поэтому ему нужен доступ к контейнеру с данными.

   Если класс A оперирует данными нескольких контейнеров то это классический пример паттерна "алгоритм". Класс контейнер реализует подкласс итератор для доступа к своим данным. "алгоритм" использует итератор для навигации по данным.
  В качестве примера можно привести алгоритм std::sort может сортировать данные различных контейнеров, например данные класса std::vector или std::list.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
wallstreet
Дата 16.7.2015, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, буду копать!)
PM MAIL   Вверх
bsa
Дата 28.7.2015, 14:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Alexeis @  16.7.2015,  14:04 Найти цитируемый пост)
В качестве примера можно привести алгоритм std::sort может сортировать данные различных контейнеров, например данные класса std::vector или std::list. 

Плохой пример - std::list и std::sort несовместимы. Тут или std::sort надо заменить на что-то иное (например, std::fill), или std::list на std::deque.
PM   Вверх
TarasProger
Дата 7.8.2015, 09:54 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Alexeis @  16.7.2015,  09:48 Найти цитируемый пост)
  Это отношения 2х объектов, а не части и целого. В этом случае наследование не помогает.
И где же здесь второй объект? Это отношение защищённого поля одного класса и метода другого класса.

Добавлено @ 10:01
А зачем вообще понадобилось декларировать параметр типом ссылки на Base? Можно же использовать сам класс A: так как он - наследник, то у него тоже есть protected-поле a типа int, ведь любой экземпляр A одновременно является и экземпляром всех его предков. И к своему полю доступ есть.

Это сообщение отредактировал(а) TarasProger - 7.8.2015, 10:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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