2
我是shared_ptrs的新手,一直在努力處理「可選」指針參數的正確方法。也就是說,如何將指針參數傳遞給方法,其中任何一個方法在任何給定的調用中都可能爲NULL。這裏有一個簡單的例子使用原始指針:這是傳遞可選/ NULL shared_ptr參數的好習慣嗎?
class Obj {
SomeType *ptrA;
SomeType *ptrB;
...
void method(SomeType* a, SomeType* b) {
ptrA = a;
ptrB = b;
}
}
現在切換到shared_ptrs:
class Obj {
shared_ptr<SomeType> ptrA;
shared_ptr<SomeType> ptrB;
// Option 1: pointers to shared pointers:
void method1(shared_ptr<SomeType>* a, shared_ptr<SomeType>* b) {
if (a) ptrA = *a;
else ptrA.reset();
// repeat for b
}
// Option 2: pass empty shared_ptrs as analog for NULL
void method2(shared_ptr<SomeType> a, shared_ptr<SomeType> b) {
ptrA = a;
ptrB = b;
}
}
方法1採用指針shared_ptrs使呼叫者可以傳遞NULL,你可以很容易地用默認設置爲NULL值聲明參數。然而,邏輯有點混亂,使用指向shared_ptrs的指針似乎是錯誤的。
method2要求調用者爲任何「NULL」參數創建臨時空的shared_ptrs。這很麻煩並且最好模糊。
方法1是最好的方法嗎?有沒有更好的辦法?我完全錯過了這裏的船嗎?
我不確定我是否遵循你的論點。關於傳遞一個臨時空的'shared_ptr'有什麼麻煩和晦澀的?另一方面,是不是要求'Obj'釋放其中一個指針完全不同的操作,要求它共享一個新對象的所有權?如果是這樣,爲什麼這些不同的操作有不同的功能,那麼在這兩種情況下調用者可以使用完全簡單和清晰的函數調用? – 2011-12-24 11:05:25
爲了這個目的,看看Boost.optional。 – 2011-12-24 11:07:25
@CharlesBailey在我看來,像方法(shared_ptr(),shared_ptr ())類似於方法(NULL,NULL)的可讀性一目瞭然。如果我理解了一些東西,你應該使用明確的臨時對象,這使得它變得更糟(我認爲)。你說得很清楚,但在某些情況下,將所有參數傳遞到單一方法而不是單獨的設置者/獲取者是更合適的。 –
dschultz
2011-12-24 11:29:59