簡體   English   中英

從模板化的類賦值運算符訪問私有成員變量

[英]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;

};

注意,如果TU是不同的類型,那么Container<T>Container<U>是兩個完全不同的類; 如果你不交朋友,就不能訪問其他私人成員。

還要注意的是,在上面的代碼類模板的所有實例彼此的朋友。 也就是說,如果用charintshort實例化它,那么

  • Container<int>將是Container<char>Container<short>
  • Container<char>將是Container<int>Container<short>
  • Container<short>將是Container<int>Container<char>

這里有趣的一句是: “彼此的朋友” 通常這不會發生。 例如,如果您有這樣的類:

class A
{
   friend class B;
};

那么這里只有BA朋友。 A不是B朋友。 他們不是“彼此的朋友” B可以訪問A私有成員,但A不能訪問B私有成員。 這就是這個類和上面的模板類之間的區別。

第一個運算符起作用,因為訪問是類范圍而不是對象范圍。 這意味着您可以跨同一類的實例訪問私有成員。

要在不使用getter或setter的情況下訪問其他類的私有成員,您需要讓您的類與其他類成為朋友。

其他方式涉及黑客攻擊,直接訪問內存並且不可移植。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM