Альтернатива другу при перегрузке >>? - PullRequest
0 голосов
/ 22 марта 2012

В ситуации ниже есть ли альтернатива использованию друга? Я хотел бы сохранить всю функциональность перегрузки оператора >>. Я не хочу, чтобы в классе читателей были открытые средства доступа.

struct FunctorBase
{
    virtual ~FunctorBase(){}
    virtual void operator()(Reader &reader) const = 0;
};

//does specific stuff related to the purpose of end.
struct end : FunctorBase
{
    void operator()(Reader &reader) const
    {
        //work with private data in reader
    }
};

class Reader
{
    friend class end; //I want to get rid of this if possible without losing the
                      //functionality of operator>> or providing accessors

    Reader& operator>>(const FunctorBase &functor)
    {
        functor(*this);

        return *this;
    }
};

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: я планирую иметь несколько производных классов FunctorBase, таким образом, несколько объявлений друзей. Разве это не злоупотребляет концепцией друга?

1 Ответ

2 голосов
/ 22 марта 2012

Полагаю, лучшее решение зависит от того, что end имеет отношение к Reader .

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

class ReaderInterface
{
public:
    void method()
    {
    }
};

// This is your "end" class, derived from FunctorBase,
// the consumer of ReaderInterface
class Consumer
{
public:
    Consumer(ReaderInterface readerInterface)
    {
        readerInterface.method();
    }
};

class Reader : private ReaderInterface
{
public:
    void test()
    {
        Consumer consumer(*this);
    }
};
...