访问私有变量

时间:2015-03-18 21:00:42

标签: c++

我试图了解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");
}

1 个答案:

答案 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指针获得了所需的信息。

一般的想法是,您将状态存储为私有,然后为操作该状态的类的用户提供一堆公共函数。用户不应该直接操纵状态,所以如果你发现你正在退一步并重新考虑你的设计。