Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Доступ к защищенному свойству объекта


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

Код

#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;
}

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

Автор: wallstreet 16.7.2015, 11:42
Спасибо, Alexeis 

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

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

Подскажите, какую объектную модель было бы правильнее реализовать в моем случае?

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

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

Автор: wallstreet 16.7.2015, 13:30
Спасибо, буду копать!)

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

Плохой пример - std::list и std::sort несовместимы. Тут или std::sort надо заменить на что-то иное (например, std::fill), или std::list на std::deque.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)