Доступ к закрытым переменным-членам из шаблонного оператора присваивания класса - PullRequest
16 голосов
/ 05 августа 2011

У меня есть контейнерный класс, который шаблонизируется.Я перегружаю оператор присваивания так, что производные типы также могут быть назначены.

Моя проблема в том, что когда тип не совпадает, я не могу получить доступ к закрытым членам класса контейнера.Каков наилучший подход к получению доступа?Переменные-члены нельзя сделать доступными через общедоступные методы получения.Спасибо!

Пример кода:

// 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;
}

Ответы [ 2 ]

20 голосов
/ 05 августа 2011

Так как вы хотите получить доступ к закрытым членам класса шаблона, созданным с различными типами, вы должны сделать другие шаблоны другом класса шаблона как:

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. В этом разница между этим классом и классом шаблона выше.

1 голос
/ 05 августа 2011

Первый оператор работает, потому что доступ - это область действия класса, а не область объекта. Это означает, что вы можете получить доступ к закрытым членам через экземпляры одного класса.

Чтобы получить доступ к приватному члену из другого класса без использования методов получения или установки, вам необходимо подружить своего класса с другим классом.

Другие способы включают в себя хаки, прямой доступ к памяти и не переносимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...