嵌套的默认参数是否可以在类的构造函数中使用?

时间:2013-08-06 09:38:13

标签: c++ qt

一开始,我班级的构造函数看起来像这样(简化):

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer);

大多数情况下,默认的MetaDataSerializer会这样做,所以我决定像这样给metaDataSerializer一个默认值:

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer = MetaDataSerializerPtr(new MetaDataSerializer());

哪个工作得很好,直到我决定我希望MetaDataSerializer也有一个构造函数参数。所以我尝试了这个:

 ProjectSerializer(MetaDataSerializerPtr metaDataSerializer = MetaDataSerializerPtr(new MetaDataSerializer(DataManager data = DataManager())));

反过来导致以下错误:

  

C2462'identifier':无法在'new-expression'

中定义类型

所以,我的问题是:我做错了什么或是不可能嵌套默认参数?

4 个答案:

答案 0 :(得分:1)

您无法在 new 运算符的操作数字段中定义类型。将 DataManager data = DataManager 放在单独的语句中。

答案 1 :(得分:0)

由于无法将 data 的值传递给ProjectSerializer构造函数,因此无法完全按照您的要求执行操作。但是,您可以执行以下操作:

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer = MetaDataSerializerPtr(new MetaDataSerializer(DataManager())));

这将允许您默认构造ProjectSerializer。

答案 2 :(得分:0)

如果MetadataSerializer类具有适当的构造函数,只需传递一个对象,不要像现在那样尝试声明变量:

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer = MetaDataSerializerPtr(new MetaDataSerializer(DataManager()))

但是,您应该小心使用指针,因为您可能会使用new创建参数时发生内存泄漏。您可能希望查看智能指针,例如std::unique_ptr(或可能std::shared_ptr)。

答案 3 :(得分:0)

绝对可以将表达式嵌套在默认参数中。只需将其写为表达式,而不是声明:

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer = MetaDataSerializerPtr(new MetaDataSerializer(DataManager())));

然而,无法覆盖默认表达式的那一部分。要么您不提供参数,在这种情况下使用默认表达式,或者您提供参数,它用于整个参数。您不能为子表达式赋值。

但是你可以重载构造函数:

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer = MetaDataSerializerPtr(new MetaDataSerializer(DataManager())));
ProjectSerializer(DataManager data) :
    ProjectSerializer(new MetaDataSerializer(data)) { /* ... */ }

注意,只有其中一个可能有默认值,否则不带参数的调用将是不明确的。但它当然可能是其中之一:

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer);
ProjectSerializer(DataManager data = DataManager()) :
    ProjectSerializer(new MetaDataSerializer(data)) { /* ... */ }

是等价的。上面显示了C ++ 11委托构造函数。如果您没有C ++ 11编译器,则必须复制初始化。