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

Accessing a private field from one class to another not related to the former class in C++ (OOP)

本文关键字:字段 一个 OOP 另一个 访问 C++      更新时间:2023-10-16

我有 2 个类 -A and B.类A具有成员list<int>和向此列表添加一个数字的方法addData()。第二个类B有一个函数displayContent()- 它遍历类A的列表并打印其内容(添加的数字(。我面临的问题是我无法从新实例化的对象(从类B(访问类Aprivate(不能更改为公共(字段list。我想问一下如何通过getters/setterscopy constructor来实现这一点?

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

在好的代码中,类永远不会纠缠。这意味着,如果类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;
};

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

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

即便如此,即使从派生类之外的任何地方也不可能访问类 A 的私有变量。

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

另一种实现方式是将类 B 声明为 A 类的好友。 这样,可以从类 B 访问私有变量

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

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

现在,您可以在 B 类中添加:

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

在同一度量中,您可以使用 setter 来更改私有属性的值,例如

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