Как разрешить классу-контейнеру изменять свои дочерние защищенные членыC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как разрешить классу-контейнеру изменять свои дочерние защищенные члены

Сообщение Anonymous »

Я пишу небольшую библиотеку графического интерфейса в качестве практики и для личного использования. У меня следующая ситуация:
Изначально у меня все было как публичные члены Elem, но теперь я решил добавить немного инкапсуляции, чтобы вы не могли получить доступ к внутренним компонентам пользовательского кода при определении виджетов/композитов; при написании кода макетирования я решил, что элементы контейнера, такие как Grid, Вертикальный, Горизонтальный, Stack и т. д., должны задавать позиции макета управляемых объектов и тому подобное (

Код: Выделить всё

internal_var
в примере).
Уменьшенный фиктивный код:

Код: Выделить всё

struct Elem{
public:
int internal_var;
};
struct FancyElem : public Elem{...};
struct ElemContainer : public Elem{
void foo(){
for(Elem* ptr : cont){
ptr->internal_var++; //modify internals here
}
}
std::vector cont;
};

Код: Выделить всё

struct Elem{
// mark internals as protected/private
protected:
int internal_var;
};
struct ElemContainer : public Elem{
void foo(){
for(Elem* ptr : cont){
ptr->internal_var++; //cant access protected member
}
}
std::vector cont;
};
Теперь я понял, что могу добиться этой цели, установив TypeContainer другом Type:

Код: Выделить всё

struct Elem{
friend class ElemContainer;
protected:
int internal_var;
};
Меня больше интересует «поступать правильно», а не просто заставить его скомпилироваться; У меня также есть гораздо больше разных ElemContainer или Elem в целом, которые могут захотеть изменить внутренние компоненты, поэтому мне придется вручную пометить каждого из них как друга Type. Если я это сделаю, определение пользовательских контейнеров в других проектах, которые я не обязательно хочу добавлять в базовую библиотеку, становится проблематичным.
Базовый вариант: я хотел бы запретить публичный доступ к Internal_var, но я хочу иметь возможность изменять его с помощью указателя из внутри производного класса, поэтому мне интересно, есть ли альтернативы методу friends.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ed-members
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»