Вопрос

Поскольку классовая дружба не наследуется в C++, как лучше всего ее «подделать»?

Я думал о раскрытии частного интерфейса дружественного класса через защищенные методы в базовом классе, который будет унаследован, но это приводит к необходимости писать (и поддерживать) один и тот же интерфейс дважды.

Есть ли другие способы?

Это было полезно?

Решение

Использование ключ это возможное решение.

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

// Step 1: The key
class NeedAccess;

namespace details { class Key { friend NeedAccess; Key() {} }; }

// Step 2: NeedAccess
class NeedAccess
{
protected:
  static details::Key GetKey() { return details::Key(); }
};

// Step 3: The big one
class BigOne
{
public:
  void lockedMethod(details::Key);
};

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

Еще одним преимуществом является то, что у вас может быть несколько ключей, в зависимости от того, к какому методу вы хотите получить доступ. Таким образом вы предоставляете «частичную» дружбу, и ваши «частичные» друзья не смогут возиться с вашими личными частями, несмотря на известное утверждение!

РЕДАКТИРОВАТЬ:

Этот метод называется «Ограниченная дружба» и обсуждался на comp.lang.c++.модерируемый.

Основное преимущество этого метода по сравнению с Частный интерфейс, является слабой связью, поскольку необходимы только предварительные объявления.

Другие советы

Дети класса с дружескими отношениями должны попросить родителя предоставить им доступ.

class CrustyNeighbour
{
    private:
       friend class Bob;
       void useWiFi(std::string const& data);
};

class Bob
{
    protected:
        useWifi(CrustyNeighbour& neighbour,std::string const& data)
        {  neighbour.useWiFi(data);}
};

class Mary: public Bob // Bob's offspring
{
     void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour
     {
         useWifi(owner,gameData);  // use wifi via his/her parent who access to eighbours wifi
     }
};

Не уверен, что это не то, о чем вы уже думаете, но вот Виртуальный друг пример

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top