从一个类访问一个私有字段,而该私有字段与C ++(OOP)中的前一个类无关

时间:2018-06-30 07:07:39

标签: c++ oop field private access

我有2个课程-A and B。类A具有成员list<int>和方法addData(),该方法将一个数字添加到此列表中。第二个类B具有函数displayContent()-遍历类A的列表并打印其内容(添加的数字)。我面临的问题是,我无法从新实例化的对象(来自类private)访问类list的{​​{1}}(无法更改为公共)字段A。我想问一下如何使用Bgetters/setters来实现?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

在好的代码中,类永远不会纠缠在一起。这意味着,如果类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中进行很多更改(例如,将列表更改为vector),而不必在B中进行任何更改。

还有更多的可能性。简单的吸气剂可以解决问题:

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

private:
    list<int> mData;
};

答案 2 :(得分:0)

要访问类A的变量“ a”,当前的实现是不可能的。

首先,使类B为基类A的派生类

即使那样,即使是派生类,也无法从外部访问类A的私有变量。

尝试通过将变量声明为受保护的方式来实现。

另一种实现方式可以是将B类声明为A类的朋友。 这样,可以从类B

访问私有变量

答案 3 :(得分:0)

getter是一个成员函数,它允许从对象外部读取成员属性List<int> L。 在A类中定义:

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

现在您可以添加B类:

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

同样,您可以使用设置器来更改私有属性的值,例如

 public:
    void setList(List<int> data){
        L=data;
       }
相关问题