Объявление друга для одного члена вместо целого класса?
Обычно в C++, когда класс A объявляет дружбу с классом B, класс B имеет полный доступ к закрытым членам класса A. Что мне нужно сделать, это позволить классу B получить доступ только к одному частному члену класса A и ничего больше. Есть ли способ для этого, может быть, что-то новое в C++11?
2 ответа
Не то, чтобы я знал. Если действительно важно разрешить доступ только одному члену, вы можете перенести данные в другой класс (C
), который имеет полностью частные члены, сделать этот класс другом B
и предоставить общедоступный доступ для C
объект в A
,
Что-то вроде этого:
template<class T> class MatesWithB
{
friend class B;
public:
MatesWithB( T & val ) : data(val) {}
private:
T& data;
operator T&() { return data; }
operator const T&() const { return data; }
};
class A
{
// ...
MatesWithB<int> GetPrivateThingy() { return MatesWithB(thingy); }
private:
int thingy; // Shared with class B
};
Что-то вроде того. Я не проверял это через компилятор.
Но мне просто интересно... Когда вы обнаружите, что нуждаетесь в этом, разве что-то в вашем дизайне не имеет принципиальных недостатков?
Предполагая, что у вас есть ХОРОШАЯ причина иметь функцию "друг", я не вижу ничего плохого в том, чтобы "доверять" функции "друг", чтобы не касаться других вещей, кроме того, что она должна касаться.
Имейте в виду, что ЛЮБАЯ функция, которая имеет адрес вашего класса [или может каким-то образом добраться до адреса], может изменять переменные-члены, если эта функция пожелает это сделать. Возможно, он не сможет сделать это портативным, безопасным и надежным способом в будущем, но приведёт указатель к char *
сможет изменить что-либо в пределах класса, который не ограничен операционной системой.
Дело о private
, protected
, public
, friend
и т. д. позволяет компилятору проверить, что вы "подчиняетесь контракту", но это могут быть переопределены "умными" программистами, которые полны решимости сделать это. Как часть этого "контракта" является то, что friend
класс или функция могут касаться чего-либо в классе, друг которого он является. Вот так вот. Если вы этого не хотите, то не стоит объявлять это другом...