我试图了解C ++中的封装。当所有内容都在公共场合时,我有这个程序正在工作,但是当我将向量移动到私有时,我无法使用我的公共函数访问向量。我尝试过使用朋友,但我无法让它发挥作用。如何让我的addElement
函数看到向量?
#include <iostream>
#include <vector>
using namespace std;
class MySet{
private:
vector<int> elements;
public:
MySet();
friend void addElement(int value);
};
MySet::MySet (){
vector <int> elements;
}
void MySet::addElement(int value){
elements.push_back(value);
}
void Print(vector<int>& v) {
vector<int>::iterator it;
for(it = v.begin(); it != v.end(); ++it) {
cout << (*it) << '\n';
}
}
int main(int argc, char *argv[]){
int value;
MySet set;
cout << "Enter your numbers,(enter -1 to end)" << endl;
while(cin){
cin>> value;
if(value==-1)
break;
set.addElement(value);
}
Print(set.elements);
system("PAUSE");
}
答案 0 :(得分:1)
基本上你想要一个Print
方法,而不是试图访问私有成员变量。一般来说,尝试直接访问私有变量通常是一个好兆头,它首先不应该是私有的,或者你需要更改你的设计。在这种情况下,改变您的设计很可能会带来最好的结果:
using namespace std;
class MySet{
private:
vector<int> elements;
public:
MySet();
friend void addElement(int value);
void print() {
vector<int>::iterator it;
for(it = this->elements.begin(); it != this_.elements.end(); ++it){
cout << (*it) << '\n';
}
}
};
现在您可以这样打印:
set.print();
这避免了使用私有成员的问题。
请注意,我们不再需要将MySet
的特定实例传递给print函数,这是因为该类已经通过this
指针获得了所需的信息。
一般的想法是,您将状态存储为私有,然后为操作该状态的类的用户提供一堆公共函数。用户不应该直接操纵状态,所以如果你发现你正在退一步并重新考虑你的设计。