2010-05-20 43 views
0

我有一個簡單的類,並且具有指向第一類中的屬性另一個類:指點類屬性與載體另一個類

#include <iostream> 
#include <vector> 

using namespace std; 

class first{ 
public: 
    int var1; 
}; 

class second{ 
public: 
    first* classvar; 
}; 

然後,我已經得到了是應該的空隙將「classvar」指向「first」類的預期迭代。

void fill(vector<second>& sec, vector<first>& fir){ 
    sec[0].classvar = &fir[0]; 
} 

最後main()。創建並填充「first」類的向量,創建「second」向量,並運行fill函數。

int main(){ 

    vector<first> a(1); 
    a[0].var1 = 1000; 

    vector<second> b(1); 

    fill(b, a); 

    cout << b[0].classvar.var1 << '\n'; 

    system("PAUSE"); 
    return 0; 
} 

這給了我下面的錯誤:

1>c:\...\main.cpp(29) : error C2228: left of '.var1' must have class/struct/union 
1>  type is 'first *' 

而且我想不通爲什麼它會讀取「classvar」作爲整個矢量而不只是單個實例。我應該這樣做

cout << b[0].classvar[0].var1 << '\n'; 

它完美地讀取。

任何人都可以找出問題嗎? 預先感謝

回答

0

問題是b[0].classvar是一個指針。要通過指針訪問類的成員,您必須使用->運算符,而不是.

原因b[0].classvar[0].var1的工作原理是因爲索引運算符[]用於指針使得這相當於(*(b[0].classvar + 0)).var1。換句話說,它將0加到指針然後解除引用,所以你可以用點運算符來訪問它。

0
cout << b[0].classvar->var1 << '\n'; 

b[0].classvar是一個指針。您當前的代碼應該對該修補程序有效,但請確保您以後不會使指針失效。

0
b[0].classvar->var1 
0

cout << b[0].classvar.var1 << '\n'; 

應該是

cout << b[0].classvar->var1 << '\n'; 

因爲第二的classvar是一個指向第一個。

b[0].classvar[0].var1 

作品由於指針&陣列用C & C++的等價性。