我想从函数返回一个对象作为输出参数,但该对象没有默认构造函数,所以我不能这样做:
bool FindFlaggedObject(MyObject& myObject)
{
std::vector<MyObject> myObjects = GetSomeObjectList();
for (UINT i = 0; i < myObjects.size(); i++)
{
if (myObjects[i].Flag) {
myObject = myObjects[i];
return true;
}
}
return false;
}
void main()
{
MyObject myObject; // NOT ALLOWED - OBJECT HAS NO DEFAULT CONSTRUCTOR
if (FindFlaggedObject(myObject))
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
所以,看起来我应该在堆上返回它并使用shared_ptr实例进行管理,如下所示:
bool FindFlaggedObject(MyObject& myObject)
{
std::vector<MyObject> myObjects = GetSomeObjectList();
for (UINT i = 0; i < myObjects.size(); i++)
{
if (myObjects[i].Flag) {
myObject = new MyObject(myObjects[i]);
return true;
}
}
return false;
}
void main()
{
MyObject* myObjectPtr;
if (FindFlaggedObject(myObjectPtr))
{
std::shared_ptr<MyObject> myObject(myObjectPtr);
...
}
}
Run Code Online (Sandbox Code Playgroud)
缺点是任何调用该方法的人都必须记住他负责释放该对象.
将无构造函数的对象作为输出参数返回的最佳实践是什么?
如果对象支持复制(并且将在堆栈上声明的对象通常应支持复制),则按值返回几乎总是最佳解决方案.如果函数可能失败,并且不总是返回一个对象,则可以使用某种类Fallible
或Maybe
类:
Fallible<MyObject>
FindFlaggedObject()
{
std::vector<MyObject> objects = GetSomeObjectList();
std::vector<MyObject>::const_iterator current = objects.begin();
while ( current != objects.end() && !current->flag ) {
++ current;
}
return current == objects.end()
? Fallible<MyObject>()
: Fallible<MyObject>( *current );
}
Run Code Online (Sandbox Code Playgroud)
但是,您可能会反思:如果GetSomeObjectList()始终可以返回对现有列表的引用(而不是在内部构造列表),并且您修改它以返回const引用,则可以只返回一个指针:
MyObject const*
FindFlaggedObject()
{
std::vector<MyObject> const& objects = GetSomeObjectList();
std::vector<MyObject>::const_iterator current = objects.begin();
while ( current != objects.end() && !current->flag ) {
++ current;
}
return current == objects.end()
? NULL
: &*current;
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常典型的C++习语.
归档时间: |
|
查看次数: |
237 次 |
最近记录: |