我在C ++中有以下struct
,我想知道在使用它时是否需要为它定义非默认构造函数,如下所示: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;
};
答案 0 :(得分:4)
“这个POD需要一个非默认的构造函数”......什么是POD? POD不包含字符串和地图等复杂对象。 POD代表普通旧数据,类似于双精度数和字符数组。
是否需要构造函数取决于您是否要确保所有数据都以某种理智状态初始化。 std::map
,std::vector
和std::string
都已初始化为您为空。另一个boost::shared_ptr
将是NULL
。 attrib
只是一种类型,你最初不会有任何attrib对象,所以不用担心。但是,除非您在构造函数中自己执行,否则 NodeType枚举不会在任何地方初始化。那有关系吗?只有你可以决定,但从技术上讲,你必须确保在阅读它之前将它分配给某个地方,否则你在技术上会得到未定义的行为。
答案 1 :(得分:2)
请注意,这是not a POD。
是的,这个结构需要一个默认的ctor,因为否则枚举成员在默认构造后会有一个未定义的值。你如何使用它并不重要 - 或者,如你的示例代码boost::shared_ptr<node> p_node = boost:shared_ptr<node>();
根本不使用它,因为它只是初始化一个NULL共享ptr而你也可以写{{1} }
答案 2 :(得分:1)
1-)如果在结构或类中定义任何构造函数(带0或1或n参数),则不会自动创建C ++默认构造函数。
所以现在每件事情都只取决于你对构造函数的调用。
如果你创建对象Node * x = new Node();这必须调用没有参数的构造函数,并且你的类必须有没有参数的构造函数[Read First Line Again]。
让我们检查你的struct或class中是否有任何没有参数的构造函数。如果你在C ++中创建任何带有任意数量参数的构造函数,我会再说一遍,那么C ++解释器就不会自动创建默认构造函数。
第1行非常重要。