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