一开始,我班级的构造函数看起来像这样(简化):
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'
中定义类型
所以,我的问题是:我做错了什么或是不可能嵌套默认参数?
答案 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编译器,则必须复制初始化。