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访问,而类永远不会纠缠在一起。这意味着,如果classB
使用classA
,则classA
不应了解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;
};
在好的代码中,类永远不会纠缠在一起。这意味着,如果classB
使用classA
,则classA
不应了解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
?