Использование друзей с базовыми классами для параметра Boost

Я использую учебник Boost Parameter для создания конструктора именованных параметров для генератора игральных карт. В учебнике сказано, что ArgumentPack нужно поместить в базовый класс, но я хочу изменить переменные в классе генератора карт. Я думал об этом:

class CGconstructor_base {
public:
      template<class ArgumentPack>
      CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code
      in this function */
      friend CardGenerator;//so it can modify the variables of CardGenerator
}
class CardGenerator:public CGconstructor_base;

Это законно или есть лучший способ манипулировать закрытыми переменными в CardGenerator и использовать библиотеку параметров Boost? ОС: Windows XP Pro, Компилятор: Visual C++ 2008 Express, Повышение: 1.39.0

1 ответ

Решение

Я думаю, что нам нужна уборка.

  1. объявление друга кажется некорректным, из комментария вы хотите, чтобы CGconstructor_base имел доступ к атрибутам CardGenerator: если это так, то объявление друга переходит в CardGenerator (я говорю, кого я считаю своими друзьями, вы не объявляете себя как будучи кем-то, кого я считаю другом).

  2. В любом случае, зачем тебе друг? Было бы намного лучше, если бы, как в учебнике, вы использовали структуру, а затем вставили атрибуты в CGconstructor_base. Таким образом, вы сможете получить к ним доступ из CardGenerator, естественно, без этой дополнительной линии. Когда вы можете обойтись без ключевого слова "друг", вы должны это сделать (обычное предостережение: если это не слишком увеличивает стоимость).

  3. Вы хотите ЧАСТНОЕ наследование здесь, это реализация детали. Используйте публичное наследование (или даже защищенное даже), когда ДРУГИЕ классы / методы должны будут знать, что вы используете базу "как-а".

В двух словах:

struct CGconstructor_base {
      template<class ArgumentPack>
      CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code
      in this function */

      cg_type1 cg_attr1;
      cg_type2 cg_attr2;
}; // don't forget this

class CardGenerator:private CGconstructor_base {};

Я удивляюсь, почему "наследование" было выбрано бустом, а не (я думаю) более чистым составом. Гораздо проще злоупотреблять наследованием (и требовать множественного наследования)... Я полагаю, что оно того стоит.

Другие вопросы по тегам