Так что, возможно, это глупый вопрос, и я слишком долго обдумываю это, но у меня следующая ситуация. Я делаю «оболочку класса», которая может запускать абстрактные объекты «действия класса». Это единственный класс, который должен создавать или использовать эти объекты. Объекты действий нуждаются в доступе к оболочке для выполнения определенных действий с ней, но я стараюсь не добавлять для этого общедоступные интерфейсы (это не должно быть разрешено никому).
Изначально у меня был простой (не такой элегантный)
class Shell
{
public:
bool checkThing();
// etc...
private:
bool _thing;
};
class Action
{
public:
virtual void execute( Shell &s )=0;
};
class ChangeAction : public Action
{
public:
void execute( Shell &s )
{
// requires friendship or public mutator!
s._thing = true;
}
};
Поэтому я рассматривал вложенный класс Action, но я хотел сделать его закрытым (зачем позволять кому-либо делать конкретные Действия, кроме Shell, верно?)
class Shell
{
public:
bool checkThing();
// etc...
private:
bool _thing;
class Action;
};
class Shell::Action
{
public:
virtual void execute( Shell &s )=0;
};
class ChangeAction : public Shell::Action
{
public:
void execute( Shell &s )
{
// ok now!
s._thing = true;
}
};
Но конечно, я больше не могу наследовать от Action (что имеет смысл, это приватно). Так что это не сработает.
Итак, мой вопрос, следует ли мне просто использовать первый метод и дружбу или открытый интерфейс? Могу ли я использовать что-то похожее на второй метод, чтобы сохранить эту связь с Actions и Shell? я должен просто использовать первый метод и дружбу или публичный интерфейс? Могу ли я использовать что-то похожее на второй метод, чтобы сохранить эту связь с Actions и Shell? я должен просто использовать первый метод и дружбу или публичный интерфейс? Могу ли я использовать что-то похожее на второй метод, чтобы сохранить эту связь с Actions и Shell? У вас есть идея получше?