У меня есть несколько классов. Предполагается, что один класс должен быть видимым для всех, кто в нем нуждается, а остальные являются вспомогательными классами (ну, некоторые из них являются структурами), которые должны быть доступны только для основного класса. Первоначально я реализовал это как вложенный класс внутри основного класса, но это начало делать заголовочный файл громоздким, так как я добавил больше вспомогательных классов. Итак, теперь я поместил вспомогательные классы в отдельное пространство имен с запрещающим видом имени, но я подозреваю, что есть лучший способ. Я хотел бы использовать анонимное пространство имен, но я не могу вынести вспомогательные классы из заголовка, потому что они появляются как переменные-члены в основном классе.
Вот упрощенная версия конструкции, которая сейчас находится в моем заголовочном файле, за исключением включения защиты:
namespace __TopSecretVisibleNamespace {
class Invisible{
};
}
using namespace __TopSecretVisibleNamespace;
class Visible {
public:
Visible();
private:
Invisible sneaky;
};
Какие-нибудь мысли?
Вы не можете буквально «скрыть» их, но вы можете сделать их недоступными для любого другого класса, используя protected
модификатор. Если по какой-либо причине вы не хотите использовать защищенный для всех членов класса, вы можете использовать его только для учредителя. В этом случае классы, не являющиеся друзьями, не могут получить доступ ни к одному из членов класса, включая общедоступные.
class Invisible {
friend class Visible;
protected:
Invisible() {
}
public:
// though public, they cannot be called by classes other than Visible, because they can't instantiate the class.
int Calc(int n)
{
return n*n;
}
int i;
};
class Visible {
public:
Visible(int i)
{
Invisible o;
x=o.Calc(i);
}
int x;
};
Других решений пока нет …