Все уже прибили это: flag & = ~ f;
Вы можете посмотреть на мою предыдущую публикацию.
has_flag (): вы хотите вернуть true, если все биты в f установлены? Или если хотя бы один из них установлен? Это разница между флагами & f == f против флагов & f! = 0.
Вы можете рассмотреть #include и cout
Перечисление может быть внутри класса Holder.
class Holder
{
public:
enum flag { A=1, B=2, C=4; };
...
};
Затем вы бы использовали Держатель :: A вместо A .
Возможно, вы захотите использовать для (i = 0; i
Возможно, вы захотите, чтобы ваши методы add_flag / has_flag / remove_flag принимали int, а не перечислимый тип. Это избавляет от большого количества кастинга. Если вы не хотите поддерживать все возможные значения int, можно использовать метод проверки и путь отклонения. Кстати, ничто не мешает мне вызвать add_flag (flag (5736)). И вы уже довольно часто используете enum_flag.
Вы можете использовать mFlag, а не m_flag. Это твой выбор. Но когда вы смотрите на код, подобный m_x * m_y-m_z * m_y-m_x * m_z, в зависимости от вашего шрифта, можно легко принять _ за - (Или наоборот.)
Аналогично, рассмотрите addFlag, а не add_flag. Для чего-то подобного это не имеет значения. Но когда у вас длинное описательное имя, эти подчеркивания начинают складываться, используя пространство вверх. Соблазн состоит в том, чтобы сокращать имя, делая ваш код более тупым.
Только мои 0,02 доллара.