Плюсы и минусы использования вложенных классов C ++ и перечислений? - PullRequest
44 голосов
/ 19 октября 2008

Каковы плюсы и минусы использования вложенных общедоступных классов и перечислений C ++? Например, предположим, что у вас есть класс с именем printer, и этот класс также хранит информацию о выходных лотках, вы можете иметь:

class printer
{
public:
    std::string name_;

    enum TYPE
    {
        TYPE_LOCAL,
        TYPE_NETWORK,
    };

    class output_tray
    {
        ...
    };
    ...
};

printer prn;
printer::TYPE type;
printer::output_tray tray;

В качестве альтернативы:

class printer
{
public:
    std::string name_;
    ...
};

enum PRINTER_TYPE
{
    PRINTER_TYPE_LOCAL,
    PRINTER_TYPE_NETWORK,
};

class output_tray
{
    ...
};

printer prn;
PRINTER_TYPE type;
output_tray tray;

Я вижу преимущества вложения частных перечислений / классов, но когда дело доходит до общедоступных, офис делится - кажется, это больше выбор стиля.

Итак, что вы предпочитаете и почему?

Ответы [ 13 ]

0 голосов
/ 20 октября 2008

Если вы поместите перечисление в класс или пространство имен, intellisense сможет дать вам руководство, когда вы попытаетесь запомнить имена перечисления. Маленькая вещь, конечно, но иногда маленькие вещи имеют значение.

0 голосов
/ 20 октября 2008

Я согласен с постами, которые рекомендуют встраивать ваше перечисление в класс, но в некоторых случаях имеет смысл не делать этого (но, пожалуйста, хотя бы поместите его в пространство имен). Если несколько классов используют перечисление, определенное в другом классе, то эти классы напрямую зависят от этого другого конкретного класса (которому принадлежит перечисление). Это, безусловно, представляет собой недостаток проекта, поскольку этот класс будет отвечать за это перечисление, а также за другие обязанности.

Итак, да, вставьте enum в класс, если другой код использует это перечисление только для непосредственного взаимодействия с этим конкретным классом. В противном случае найдите лучшее место для хранения перечисления, например, пространство имен.

0 голосов
/ 19 октября 2008

Для меня большой минус в том, чтобы иметь его снаружи, это то, что он становится частью глобального пространства имен. Если перечисление или связанный класс действительно относятся только к тому классу, в котором он находится, то это имеет смысл. Таким образом, в случае с принтером все, что включает принтер, будет знать о полном доступе к enum PRINTER_TYPE, где на самом деле не нужно знать об этом. Я не могу сказать, что когда-либо использовал внутренний класс, но для перечисления кажется более логичным хранить его внутри. Как отметил другой автор, также полезно использовать пространства имен для группировки похожих элементов, поскольку засорение глобального пространства имен может быть действительно плохой вещью. Раньше я работал над масштабными проектами, и просто вывод автоматического списка в глобальном пространстве имен занимает 20 минут. По моему мнению, вложенные перечисления и классы / структуры с пространством имен являются, вероятно, самым чистым подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...