2

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

ProjectSerializer(MetaDataSerializerPtr metaDataSerializer);

大多数时候,默认的 MetaDataSerializer 就可以了,所以我决定给 metaDataSerializer 一个默认值,如下所示:

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

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

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

这又导致了以下错误:

C2462“标识符”:无法在“新表达式”中定义类型

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

4

4 回答 4

1

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

于 2013-08-06T09:48:56.560 回答
0

由于无法将数据值传递给ProjectSerializer 构造函数,因此您无法完全按照您正在尝试的方式进行操作。但是,您可以执行以下操作:

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

这将允许您默认构造 ProjectSerializer。

于 2013-08-06T09:45:47.357 回答
0

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

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

但是,您应该小心处理指针的操作,因为使用new. 您可能想研究类似std::unique_ptr(或可能std::shared_ptr)的智能指针。

于 2013-08-06T09:45:53.983 回答
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 编译器,则必须重复初始化。

于 2013-08-06T09:46:14.607 回答