Это зависит от того, что вы подразумеваете под "хорошим способом" :) На модерации comp.lang.c ++. У нас был тот же вопрос некоторое время назад. Вы можете увидеть обсуждение, которое оно породило там .
IIRC, мы в конечном итоге использовали подход «друга вложенного ключа». Применительно к вашему примеру это даст:
class A
{
};
class B
{
public:
class Key{
friend class A;
Key();
};
void setFlags(Key){setFlags();}
private:
void setState();
void setFlags();
};
Идея состоит в том, что публичный setFlags () должен вызываться с "ключом", и только друзья Key могут создать его, поскольку его ctor является частным.