【发布时间】:2015-04-05 20:55:24
【问题描述】:
我有一个基类和一个派生类以及一个返回对基类的引用的函数。使用 make_unique 然后向下转换指针是否安全?
我试图避免复制操作。
class Animal {}
class Dog : Animal {}
Animal GetAnimal() { ... }
Dog GetDog() {
Dog dog = *std::make_unique<Dog>( GetAnimal() );
return dog;
}
或者有没有更直接的方法?
编辑:
这是实际代码(与我上面显示的非常接近:
// Convert from (m)anaged to (u)nmanaged Title
Title Data::MarshalTitle(TitleMap ^mdefn) {
Title udefn = MarshalValue(mdefn);
return udefn;
}
然后MarshalValue被定义为:
Value Data::MarshalValue(TitleMap ^mdefn)
现在,您在这里看不到 Value 是一个基类,而 Title 是一个派生类。
我从编译器得到的错误是:
error C2440: 'initializing' : cannot convert from 'Definitions::Value' to 'Definitions::Title' D:\Projects\Parsers\View.cpp
Intellisense 告诉我没有合适的用户定义的从值到标题的转换。
不过,这可以很好地通过编译器,但我不确定这是否安全。
// Convert from (m)anaged to (u)nmanaged Title Dimension definition
Title Data::MarshalTitle(TitleMap ^mdefn) {
Title udefn = *std::make_unique<Title>(MarshalValue(mdefn));
return udefn;
}
【问题讨论】:
-
GetAnimal()按值返回Animal,所以我看不出如何从中构造unique_ptr。make_unique是在这里使用的错误工具。请发布实际编译并说明您的问题的代码。 -
我认为您有错别字:^ 应该表示 & 吗?和 Data::MarshalValue 在其声明中返回一个值,并在其定义中返回一个标题....
-
不,^ 是托管类指针引用。此代码位于 C++/CLI 应用程序中。至于 Data::MarshalValue,我没有列出该函数的代码,它返回的是 Value 而不是 Title。返回 Title 的是 MarshalTitle。 MarshalTitle 的全部意义在于它从 Value 的基类转换为 Title 的派生类。转换实际上发生在
Title udefn = *std::make_unique<Title>(MarshalValue(mdefn));行中。
标签: c++ c++11 casting c++-cli derived-class