[英]Accessing private member variables from a templated class assignment operator
我有一個模板化的容器類。 我正在重載賦值運算符,以便也可以分配派生類型。
我的問題是,當類型不一樣時,我無法訪問容器類的私有成員。 獲得訪問權限的最佳方法是什么? 無法通過公共getter訪問成員變量。 謝謝!
示例代碼:
// Note: var is private
template <class T>
Container<T>& Container<T>::operator=(const Container<T>& rhs) {
if(*this != rhs) var = rhs.var; // works for same type
return *this;
}
template <class T>
template <typename U>
Container<T>& Container<T>::operator=(const Container<U>& rhs) {
if(*this != rhs) var = rhs.var; // does NOT work for different types
return *this;
}
由於您要訪問使用不同類型實例化的模板類的私有成員,因此您必須將其他模板作為模板類的朋友,如下所示:
template <class T>
class Container
{
template<class U>
friend class Container;
};
注意,如果T
和U
是不同的類型,那么Container<T>
和Container<U>
是兩個完全不同的類; 如果你不交朋友,就不能訪問其他私人成員。
還要注意的是,在上面的代碼類模板的所有實例是彼此的朋友。 也就是說,如果用char
, int
, short
實例化它,那么
Container<int>
將是Container<char>
和Container<short>
。 Container<char>
將是Container<int>
和Container<short>
。 Container<short>
將是Container<int>
和Container<char>
。 這里有趣的一句是: “彼此的朋友” 。 通常這不會發生。 例如,如果您有這樣的類:
class A
{
friend class B;
};
那么這里只有B
是A
朋友。 A
不是B
朋友。 他們不是“彼此的朋友” 。 B
可以訪問A
私有成員,但A
不能訪問B
私有成員。 這就是這個類和上面的模板類之間的區別。
第一個運算符起作用,因為訪問是類范圍而不是對象范圍。 這意味着您可以跨同一類的實例訪問私有成員。
要在不使用getter或setter的情況下訪問其他類的私有成員,您需要讓您的類與其他類成為朋友。
其他方式涉及黑客攻擊,直接訪問內存並且不可移植。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.