2014-12-15 3 views
1

Я хотел бы реализовать Container класс, который можно получить доступ только к классам, которые я хочу, таким образом, подобное следующемуC++ ООП только предоставить доступ к определенным классам

class ContainerAccess { 
    // empty 
}; 

class Container{ 
    private: 
    static void _do_stuff(); 
    static int _value; 

    friend class ContainerAccess; 
}; 

Теперь я хочу, чтобы иметь доступ к данным Container следующим образом:

class Processor: public ContainerAccess { 
    public: 
    void proccess() { 
     Container::_do_stuff(); 
     Container::_value++; 
    } 
}; 

Однако, это не работает. Почему это? И как это можно сделать?

+4

Это не работает и не будет работать, потому что дружба не [** унаследована **, транзитивная или взаимная] (http://www.parashift.com/c++-faq/friendship-not-inherited-transitive.html). –

+2

Дружба не наследуется. http://stackoverflow.com/questions/3561648/why-does-c-not-allow-inherited-friendship – japreiss

+0

как я мог это сделать? – manatttta

ответ

1

Ваш подход неправильный, поскольку дружба не наследуется. Однако есть хороший способ решить то, что вы пытаетесь решить, и это частное наследство.

class Container 
{ 
    protected: 
    static void _do_stuff(); 
    static int _value; 
}; 


class ContainerAccess : private Container 
{ 
    //using _do_stuff(); 
}; 

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

+0

Хм, это слишком тесно связано для моего вкуса. Я бы попытался отделить абстрактные интерфейсы. –

-2

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

Затем в своей основной функции создайте один экземпляр Container и передайте его методам/классам, которым необходим доступ к функциям, предоставленным Container.

class Processor { 
    public: 
    void process(Container & container) { 
     container.do_stuff(); 
     container.value++; 
    } 
}; 

Методы, которые вы не предоставляете экземпляр контейнера, не могут работать.

+0

Я не вижу, как создание методов 'Container' является общедоступным, придает себя хорошей инкапсуляции, и как это предложение действительно помогает OP делать то, что он хочет. – caps

+0

@caps Цель состоит в том, чтобы сделать их общедоступными, но не статичными - возможно, для Container только частный конструктор, похожий на не-глобально доступный Singleton. Затем доступ ограничивается теми, кто получает экземпляр.Операции являются общедоступными, но ограничены, например, а не операциями, доступными повсюду, но ограничиваются дружбой. – Svalorzen

+0

@Svalorzen Нет! Предоставление методов общественности, конечно, не является правильным/подходящим решением. В этом случае для классов клиента должен быть (не публично видимый) интерфейс. См. Вопросы и ответы, которые я связал в своем комментарии к вопросу. Это более общий подход к тому, как избавиться от «дружеских» отношений. –

Смежные вопросы