我想從一個函數作爲輸出參數返回一個對象,但對象沒有默認構造函數,因此我不能做到這一點:返回構造無對象作爲輸出參數
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);
...
}
}
的缺點是,任何人都調用該方法必須記住,他是負責釋放的對象。
返回無構造函數的對象作爲輸出參數的最佳做法是什麼?
當你說「無構造函數的對象」時,你是指「不可複製構造的對象」嗎?如果不是,物體從哪裏來? – Andre 2012-04-16 15:07:54
@安德烈:對不起,對象是內部構造的(例如,通過朋友類)。它們確實有一個拷貝構造函數,但沒有無參數的構造函數,因此在調用方法之前很難在堆棧上進行分配。 – drifter 2012-04-16 15:31:06