2015-05-15 2 views
1

Я мастерить с C++ и сталкиваются со следующей проблемой:Шаблон друга иерархии классов наследования

Дано:

class A { 
    int aVar; 

public: 
    A(){} 
    virtual ~A(){}; 
}; 

template<class BASE> 
class B: public BASE { 
    int bVar; 

public: 
    B() : BASE() {} 
    virtual ~B() {} 
}; 

template<class BASE> 
class C: public BASE{ 
    int cVar; 

public: 
    C() : BASE() {} 
    virtual ~C() {} 
} 

D,E,F,G... 

я могу сделать что-то вроде разветвленной иерархии классов, который наследует параметры и функции, и такие , Например typedef C<B<A>> ABC;

Однако у меня должен быть класс, который «управляет» некоторыми комбинациями этих объектов через защищенный доступ.

template<class TYPE> 
struct Manager { 
    TYPE current; 

    Manager() { 
     current.aVar++; 
     current.bVar++; 
     current.cVar++;  
    } 
    ~Manager(){} 
}; 

И мой вопрос: Как настроить A, B и C классов к другу независимо от диспетчера Manager «сек типа шаблона? (Например, Manager с шаблоном ABC, EABC, DABC, XYZEFGABC ...)

ответ

3

Просто им ДРУГ менеджером:

class A { 
    template <typename T> 
    friend struct Manager; 
}; 

template<class BASE> 
class B: public BASE { 
    template <typename T> 
    friend struct Manager; 
}; 

// etc. 
+0

[демонстрация] (http://coliru.stacked-crooked.com/a/e8a64d9c057b1d5e) (с исправлениями) – dyp

+0

@dyp Были ли еще исправления, чем изменение 'class' на' struct'? – Barry

+0

В коде OP, ctors являются частными и используют спецификаторы специфицированного типа. (dtors тоже закрыты) – dyp

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