从一个类访问私有字段到另一个与C++中的前一个类无关的私有字段 (OOP)
Accessing a private field from one class to another not related to the former class in C++ (OOP)
我有 2 个类 -A and B
.类A
具有成员list<int>
和向此列表添加一个数字的方法addData()
。第二个类B
有一个函数displayContent()
- 它遍历类A
的列表并打印其内容(添加的数字(。我面临的问题是我无法从新实例化的对象(从类B
(访问类A
的private
(不能更改为公共(字段list
。我想问一下如何通过getters/setters
或copy 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;
}
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 如何创建一个函数来提取向量内部字符串中的字段?
- 如何正确实例化静态字段 tat 是另一个类对象
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- C++11,仅将一个字段复制到向量中
- 从一个类访问私有字段到另一个与C++中的前一个类无关的私有字段 (OOP)
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- C++创建一个链表,每个节点有超过 2 个字段
- 在C++(arduino)中,我如何使用一个字段来构建另一个字段
- 模拟一个函数,该函数像操作员=和破坏者一样传播到每个字段
- 如何在 中输入记录的一个字段时搜索记录
- 两个 4 位位字段加起来不等于一个字节的大小 - 如何修复?
- 使用方法影响另一个对象的字段
- 调用方法,该方法修改字段,而使用该字段的另一个方法正在执行
- 从结构向量中,获取一个向量,该向量收集每个结构的一个字段
- 设计具有变体字段的文本类型类,其中可以存储一个或三个对象
- C 11 RVALUE的字段是一个rvalue
- 在一个结构中,使用一个数组字段访问另一个是否合法
- 通过另一个对象C++的字段中的指针访问对象