gpt4 book ai didi

c++ - 返回无构造函数对象作为输出参数

转载 作者:太空狗 更新时间:2023-10-29 23:41:33 27 4
gpt4 key购买 nike

我想从函数返回一个对象作为输出参数,但该对象没有默认构造函数,所以我不能这样做:

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))
{
...
}
}

所以,看起来我应该将它返回到堆上并使用 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);

...
}
}

缺点是调用该方法的任何人都必须记住他负责释放对象。
将无构造函数对象作为输出参数返回的最佳做法是什么?

最佳答案

按值返回几乎总是最好的解决方案,如果对象支持复制(并且将在堆栈上声明的对象应该一般支持复制)。如果该功能可能会失败,但并非总是如此返回一个对象,你可以使用某种 FallibleMaybe 类:

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 );
}

不过,您可能会想:如果 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;
}

这是一个非常典型的 C++ 习惯用法。

关于c++ - 返回无构造函数对象作为输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10176433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com