#c
#c
Вопрос:
У меня есть класс A. И у меня есть класс B. И у меня есть много-много классов, производных от класса B.
Я хочу добиться этого: производные от B должны иметь доступ к защищенным переменным A. При этом каждая из них не содержит экземпляр A, для которого потребовалось бы много памяти. Так что, я думаю, публичное наследование на этот раз не очень хорошая идея. Как мне решить эту проблему? Спасибо!
Ответ №1:
Вы могли бы сделать это с помощью friend
и функций доступа. Это позволяет доверять, B
чтобы оставаться в стороне A
от личных данных — не вижу хорошего способа разрешить только B
и подклассам доступ к только защищенным членам A
, если между A
и B
не существует отношений наследования.
class A {
friend class B;
protected:
int X;
};
class B {
protected:
static int getX(A const amp; a) { return a.X; }
};
class C : public B {
public:
void foo(A const amp; a) { int bar = getX(a); }
};
Комментарии:
1. Я бы сделал то же самое, но я бы предпочел,
static int getX
потому что по своей логике getX не относится к экземпляру B. Редактировать : Необходимость делать это вообще звучит как плохой дизайн в первую очередь.2. Чтобы разрешить
B
доступ только кA
защищенным элементам, вы могли бы получить прокси-класс изA
и сделатьB
его другом вместо этого.3. @Oli Charlesworth: Насколько я понимаю OP, у него уже есть существующие экземпляры A — если он может свободно заменить использование A прокси-классом, конечно.
Ответ №2:
Сделайте классы, производные от B, друзьями A.
Комментарии:
1. Все из них? И если я создам новый класс, производный от B, я должен добавить его в список друзей в классе A? Я хочу сделать его расширяемым. И у друзей есть доступ даже к private, который не нужен.
2. Если вы хотите, чтобы такое количество классов имело доступ к закрытым элементам A, то либо они должны быть общедоступными элементами, либо вы должны использовать общедоступные средства доступа. В любом случае, это признак того, что вам следует пересмотреть свой дизайн.
3. Да, все из них. Если бы класс, производный от B, мог решить стать другом A, это позволило бы обойти сокрытие информации. С другой стороны, решение Erik могло бы быть лучше.
Ответ №3:
Насколько я понимаю, дочерние элементы B
не связаны с классом A
и как таковые не должны иметь доступа к закрытым частям A
.
Правильный способ получить доступ к A
данным внутри B
дочерних классов — через A
открытый интерфейс. Если такой общедоступный интерфейс неадекватен, то это сигнал о том, что либо вы пытаетесь сделать что-то с плохим дизайном, либо этот A
общедоступный интерфейс нуждается в улучшении.