Я построил автомат для конечных автоматов на основе классов. Класс контекста (класс, внутреннее состояние которого изменяется) имеет несколько методов, к которым должны обращаться только состояния (увеличивая / уменьшая некоторые итераторы, нажимая / выталкивая состояния, устанавливая состояние принятия и т. Д.). Прямо сейчас они являются публичными из-за различных государств, нуждающихся в доступе к ним.
Было бы лучше сделать методы защищенными / частными и определить состояния как друзей контекста?
(nb4 «основанный на мнении!»)
Может быть разумно создать коллекцию классов, которые работают вместе для общих целей друзей, но есть одна альтернатива, которую вы могли бы рассмотреть.
Для действительно короткого, наивного примера:
class outer
{
private:
int a;
int b;
public:
class inner
{ public:
outer * o;
inner( outer * io ) : o( io ) { o->a = 0; }
};
};
int main(int argc, const char * argv[])
{
outer o;
outer::inner i( &o );
return 0;
}
Я сделал это быстро, поэтому конструкция внутреннего взятия указателя не очень хороша в C ++, так что не принимайте это за совет.
Дело в том, что это компилируется, даже если inner получает доступ к закрытым членам external.
Это еще один способ сделать то, что вы просили.
Других решений пока нет …