это довольно странный вопрос, но я использую вложенные классы для создания функциональности, подобной свойствам, в c ++.
Я также сделал это как ReadOnly, сделав защищенным оператор присваивания вложенного класса, а хост-класс Friend
вложенного класса.
К сожалению, кажется, что любой наследующий класс (с : public BaseClass
) все еще не может получить доступ к оператору присваивания вложенного класса.
Я не знаю, если это имеет значение, но я поставил Friend
в публичной части класса.
Кто-нибудь знает, как я могу это исправить? (или взломать) Спасибо
РЕДАКТИРОВАТЬ: пример кода добавлен
#define ReadOnlyProperty(type,name,parent) \
protected: \
class name : public PropertyBase<type> \
{ \
parent* This; \
public: \
friend class parent; \
name(parent* instance) { This = instance; } \
protected: \
void operator=(type value) {Set(value);} \
void Set(type value); \
type Get() const; \
}; \
public: name name; \
friend class name; \
private:
Базовый класс:
class Object
{
ReadOnlyProperty(char,Type,Object);
public:
Object() : Type(this) {}
};
Наследование класса
class A : public Object
{
public:
A() {Type = 'A';}
};
я получаю сообщение об ошибке типа = ‘A’
Дружелюбие не передается по наследству.
Непонятно, каково лучшее решение; возможно, объявить вложенный класс в защищенном разделе базового класса и сделать его члены публичными? Таким образом, дружба не нужна, но вещи из-за пределов иерархии классов не смогут с этим возиться.
и не имеет значения, в каком разделе вы ставите декларацию друга.
возможно, вместо этого поместите внутренний класс в защищенный раздел и сделайте его интерфейсы общедоступными.