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

C++ 在C+中,从一个类访问与前一个类无关的私有字段+;(OOP),c++,oop,field,private,C++,Oop,Field,Private,我有两门课-A和B。类A有一个成员list和一个方法addData(),该方法将数字添加到此列表中。第二个类B有一个函数displayContent()——它遍历类a的列表并打印其内容(添加的数字)。我面临的问题是,我无法从新实例化的对象(从类B)访问类A的private(不能更改为public)字段list)。我想问一下,如何使用getter/setters或复制构造函数来实现这一点?在displayContent_a中,您标识的“a”未定义,因为在该函数或类中您从未声明过变量“a”。一个简单

我有两门课-
A和B
。类
A
有一个成员
list
和一个方法
addData()
,该方法将数字添加到此列表中。第二个类
B
有一个函数
displayContent()
——它遍历类
a
的列表并打印其内容(添加的数字)。我面临的问题是,我无法从新实例化的对象(从类
B
)访问类
A
private
(不能更改为public)字段
list
)。我想问一下,如何使用
getter/setters
复制构造函数来实现这一点?

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

    }

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

    }

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

首先,将类B作为基类A的派生类

即使这样,也不可能从外部的任何地方访问类A的私有变量,即使是从派生类

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

另一个实现是将类B声明为类A的朋友。
这样,可以从类B访问私有变量,以访问类a的变量“a”,这在当前实现中是不可能的

首先,将类B作为基类A的派生类

即使这样,也不可能从外部的任何地方访问类A的私有变量,即使是从派生类

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

另一个实现是将类B声明为类A的朋友。
这样,在好的代码中,私有变量可以从类B访问,而类永远不会纠缠在一起。这意味着,如果class
B
使用class
A
,则class
A
不应了解
B
。 因此,添加友谊只是一种让代码陷入困境的变通方法

在不了解更多上下文的情况下,很难说什么是最好的方法,但有两种可能性

您可以将此类API添加到:

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

在好的代码中,类永远不会纠缠在一起。这意味着,如果class
B
使用class
A
,则class
A
不应了解
B
。 因此,添加友谊只是一种让代码陷入困境的变通方法

在不了解更多上下文的情况下,很难说什么是最好的方法,但有两种可能性

您可以将此类API添加到:

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

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

public:
   List<int> getList(){
      return L;
     } 
公共:
List getList(){
返回L;
} 
现在您可以在B类中添加:

A a(constructor args);
List<int>=a.getList();
A(构造函数参数);
List=a.getList();
在相同的度量中,您可以使用setter来更改私有属性的值,例如

 public:
    void setList(List<int> data){
        L=data;
       }
公共:
无效集合列表(列表数据){
L=数据;
}

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

public:
   List<int> getList(){
      return L;
     } 
公共:
List getList(){
返回L;
} 
现在您可以在B类中添加:

A a(constructor args);
List<int>=a.getList();
A(构造函数参数);
List=a.getList();
在相同的度量中,您可以使用setter来更改私有属性的值,例如

 public:
    void setList(List<int> data){
        L=data;
       }
公共:
无效集合列表(列表数据){
L=数据;
}

删除了我的答案。他要求用一个复制构造函数来完成,就我所知这是不可能的。我不知道复制构造函数会如何处理这个问题。删除了我的答案。他要求用一个复制构造函数来完成,据我所知,这是不可能的。我不知道复制构造函数如何处理这个问题。
//标识符“a”未定义?
-您没有将a的实例作为变量传递,B也不是a的子对象,那么如何定义
a
//标识符“a”未定义?
-您没有将a的实例作为变量传递,并且B不是a的子对象,那么如何定义
a