2015-03-18 76 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