【发布时间】:2015-01-07 13:45:35
【问题描述】:
问题如下:我有一个类,它封装了某种容器(即地图),我可以通过对象 ID 查询该容器。该类还封装了第二个容器,该容器保存属于对象的附加数据(即矩阵)。 我班级的客户应该有可能查询对象并决定他是否也希望返回附加数据,即以这种方式:
ObjectData objData;
Object obj = myClass.getObject(objectID, &objData);
但是,如果客户端请求附加数据,但他查询的对象没有链接到它的附加数据,那么客户端应该能够告诉这一点。 IE。如果我的函数是这样工作的:
Object MyClass::getObject(ObjectID oID, ObjectData* objData)
{
// ...
if(objData && this->hasObjectData(oID))
objData = this->getObjectData(oID);
}
并且客户端以上述方式调用它,getObject 函数识别出所查询的对象没有附加数据,并将保持传递的 objData 指针不变。然后客户端发现自己有一个默认构造的 ObjectData 对象,并且不知道它是默认构造的还是由 getObject 函数作为参数返回值返回的。
在我的脑海中,我只能想到或多或少丑陋的解决方案,例如在堆上分配数据,以便用户可以取回空指针或以某种方式向函数调用添加标志。可能更好的设计是完全单独地查询 objectData 但上面会很好而且很容易所以我想知道是否有一个优雅的解决方案仍然可以以这种方式进行。
【问题讨论】:
-
用Boost Optional怎么样?
-
我不认为堆分配/空指针解决方案特别难看。您也许可以使用智能指针使其更安全。最后,我更喜欢你的第二个解决方案。您还可以更改
getObjectData以引用ObjectData并返回一个布尔值,说明数据是否已写入。这有点紧凑。 -
我不认为你写的代码能做你想做的事。您想提供任何附加数据的副本还是指针?假设你想要一个副本,它可能应该是
*objData = this->getObjectData(oID);如果你想提供一个指针,你需要传递类似ObjectData*&的东西。