Доступ к закрытому полю из одного класса в другой, не связанный с первым классом в C ++ (ООП) - PullRequest
0 голосов
/ 30 июня 2018

У меня 2 класса - A and B. Класс A имеет член list<int> и метод addData(), который добавляет число в этот список. Второй класс B имеет функцию displayContent() - он перебирает список класса A и печатает его содержимое (добавленные числа). Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить доступ к полю private (не может быть изменено как общедоступное) list класса A из вновь созданного объекта (из класса B). Я хотел бы спросить, как этого можно достичь с помощью getters/setters или copy constructor?

Ответы [ 4 ]

0 голосов
/ 30 июня 2018

Геттер - это функция-член, которая позволяет атрибуту-члену List<int> L считываться извне объекта. В классе А определить:

public:
   List<int> getList(){
      return L;
     } 

Теперь вы можете добавить в класс B:

A a(constructor args);
List<int>=a.getList();

в той же мере вы можете использовать сеттеры для изменения значения личных атрибутов, например,

 public:
    void setList(List<int> data){
        L=data;
       }
0 голосов
/ 30 июня 2018

Доступ к переменной 'a' класса A невозможен в текущей реализации.

Во-первых, сделайте класс B производным классом базового класса A

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

Попробуйте реализовать, объявив переменную как защищенную.

Другая реализация может быть объявлена ​​классом B другом класса A. Таким образом, частные переменные могут быть доступны из класса B

0 голосов
/ 30 июня 2018

В хорошем коде классы никогда не запутываются. Это означает, что если класс B использует класс A, то класс A не должен знать о B. Поэтому добавление дружбы - это просто обходной путь, который делает код запутанным.

Трудно сказать, что является лучшим подходом, не зная больше контекста, но есть пара возможностей.

Вы можете добавить такой API к A:

class A {
public:
    void forEach(std::function<void(int)> f) const {
        for(auto x : mData) {
            f(x);
        }
    }

private:
    list<int> mData;
};

class B {
public:
    void displayContent(std::ostream &out) {
        a.forEach([&out](int x){ out << x<< ", "; });
    }

private:
    A a;
};

Преимущество заключается в том, что вы можете многое изменить в A (например, изменить список на вектор), и вам не нужно ничего исправлять в B.

Есть больше возможностей. Простой получатель может решить проблему:

class A {
public:
    list<int> getData() const {
        return mData;
    }

private:
    list<int> mData;
};
0 голосов
/ 30 июня 2018

В displayContent_a ваше идентифицированное «a» не определено, потому что в этой функции или классе вы никогда не объявляли переменную «a». Простое решение состоит в том, чтобы передать объект типа A в функцию, которая определяет, какой объект A отображать в списке:

void displayContent_a(A& a) {
        //this uses the a from the parameter
        for (auto x = a.a.begin(); x != a.a.end(); x++) { //use a.a because we want to access the list 
            cout << *x << endl;
        }

    }

Однако этого будет недостаточно, так как B не может получить доступ к личным данным A. Чтобы это исправить, вы должны сделать B другом A. Это можно сделать следующим образом:

class B; //forward declare B so it can be used in friend declarations in A

class A
{
//... your content

    friend class B;
}
...