2012-07-27 88 views
1

另一個類的訪問數據成員我有這樣的運營商超載運營

Mtx Mtx::operator*(const Vtr &rhs) const 
{ 
Mtx Q(nrows, ncols, 0); 

for (int i = 0; i < nrows; ++i) { 
    for (int j = 0; j < ncols; ++j) { 
     Q.ets[i][j] = 0.0; 

     for (int k = 0; k < rhs.length; ++k) { 
      Q.ets[i][j] += ets[i][k] * rhs.ets[k]; 
     } 
    } 
    } 
return Q; 
} 

我通過M3 = M1 * V1稱之爲運營商,我收到編譯器錯誤,因爲在第三循環lengthets[k]Vtr類的私有成員。我如何訪問它們?

回答

4

Mtx成爲Vtr的朋友。

class Vtr { 
    friend class Mtx; 
    //... 
}; 

或者讓Mtx::operator*方法成爲朋友。

class Vtr { 
    friend Mtx Mtx::operator*(const Vtr &) const; 
    //... 
}; 

這兩種變化都會讓你的當前執行工作沒有任何進一步的修改。

2

朋友是你的答案!

您可以讓課程成爲朋友或功能。

但我不確定這是否適合您的情況。

大多數情況下,如果你不能訪問一個變量,這意味着你不應該訪問它。

檢查您是否正確使用訪問說明符。唯一的方法是朋友然後使用'朋友'功能或類。

+1

+1兩點:*「你可以**班**朋友或**功能**」* – Nawaz 2012-07-27 05:22:01

4

要麼讓MtxVtr朋友或提供公共評估數據,例如

class Vtx { 
public: 
    const SomeType& operator[](unsigned int i) const { return ets[i]; } 

}; 

這實際上解耦從底層實現數據訪問,因爲運營商可以以不同的方式來實現。

另一方面,它提供了對底層表示的直接訪問,因此它添加了一個約束,您不能以改變給定索引和給定元素之間映射的方式更改實現。

+1

+1。它通常應該是首選。 – Nawaz 2012-07-27 05:22:56

+0

我成爲朋友,它的工作。但上面的代碼不起作用。有什麼隱藏的東西嗎? – 2012-07-27 05:37:10

+0

訪問者需要公開。 OP的代碼需要更改爲直接在'rhs'上使用'[]'。另外,需要一個'長度'accesssor。 – jxh 2012-07-27 05:37:38