2015-03-18 65 views
-2

我试图让我的头在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"); 
} 
+3

删除好友关键字。一个类的公共成员函数可以访问该类的私有成员。你的构造函数创建一个称为元素的局部向量,它立即被丢弃。 – 2015-03-18 21:03:12

+2

'main()'不是一个公共'MySet'函数。改变'Print(set.elements);'像'set.print_elements();' – 2015-03-18 21:03:25

+0

aaah,我明白了。它的打印功能使所有的麻烦大声笑。好吧,当我尝试访问它与集。 ,它不会在那里显示打印。 – user3225981 2015-03-18 21:08:38

回答

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的特定实例传递给打印函数,这是因为该类已经通过this指针获得了所需的信息。

总的想法是,你保存状态为私有然后给了一堆的公共职能为类的用户操作该状态。用户不应该直接操纵状态,所以如果你发现你正在退后一步并重新考虑你的设计。

+0

谢谢你的帮助,我明白了! – user3225981 2015-03-18 21:16:15