нужна ли этой структуре конструктор не по умолчанию - PullRequest
3 голосов
/ 09 декабря 2010

У меня есть следующее struct в C ++, и я подумал, нужно ли мне определять конструктор не по умолчанию для него, когда я использую его следующим образом: boost::shared_ptr<node> p_node = boost:shared_ptr<node>();

struct node
{
    std::string name;
    std::map<std::string, std::vector<variant> > values; // it is possible that nodes contain as a value, key/value pairs so we need a map

    NodeType type;  //Enum

    typedef struct attrib
    {
        std::string key;
        variant value;  //Boost::variant
    };

    std::vector<attrib> attributes;

    boost::shared_ptr<node> childnode;
};

Ответы [ 3 ]

4 голосов
/ 09 декабря 2010

"нужен ли этому POD конструктор не по умолчанию" ... какой POD?POD не содержат сложных объектов, таких как строки и карты.POD означает простые старые данные, такие как удваиваемые и символьные массивы.

Необходимость конструктора зависит от того, хотите ли вы убедиться, что все данные инициализированы в каком-то нормальном состоянии.std::map, std::vector и std::string все инициализированы, чтобы вы были пустыми.Другое boost::shared_ptr будет NULL.attrib - это всего лишь тип, и у вас изначально не будет никаких объектов атрибутов, так что не беспокойтесь.Но ваше перечисление NodeType нигде не инициализируется , если вы сами не сделаете это в конструкторе.Это имеет значение?Только вы можете решить, но технически вы ДОЛЖНЫ удостовериться, что назначаете его где-то перед чтением из него, в противном случае вы получите технически неопределенное поведение.

2 голосов
/ 09 декабря 2010

Обратите внимание, что это , а не POD .

Да, этой структуре требуется ctor по умолчанию, потому что в противном случае член enum будет иметь неопределенное значение после построения по умолчанию.Неважно, как вы его используете - или, как в вашем примере кода boost::shared_ptr<node> p_node = boost:shared_ptr<node>();, вообще не используйте его, поскольку это просто инициализирует совместно используемый ptr NULL, и вы могли бы с таким же успехом написать boost::shared_ptr<node> p_node;

1 голос
/ 11 февраля 2011

1-) Если вы определяете какой-либо конструктор (с параметром 0 или 1 или n) в вашей структуре или классе, то конструктор по умолчанию C ++ не будет создан автоматически.

Так что теперь все зависит только от вашего вызова конструктора.

если вы создаете объект Node * x = new Node ();Это должно вызвать конструктор без параметра, и ваш класс должен иметь конструктор без параметра [Read First Line Again].

Позволяет проверить, есть ли конструктор без параметров в вашей структуре или классе.Я говорю это снова, если вы создаете любой конструктор с любым количеством параметров в C ++, тогда конструктор по умолчанию не будет создаваться интерпретатором C ++ автоматически.

Строка 1 очень важна для понимания.

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