2011-12-24 68 views
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是最好的方法嗎?有沒有更好的辦法?我完全錯過了這裏的船嗎?

+1

我不確定我是否遵循你的論點。關於傳遞一個臨時空的'shared_ptr'有什麼麻煩和晦澀的?另一方面,是不是要求'Obj'釋放其中一個指針完全不同的操作,要求它共享一個新對象的所有權?如果是這樣,爲什麼這些不同的操作有不同的功能,那麼在這兩種情況下調用者可以使用完全簡單和清晰的函數調用? – 2011-12-24 11:05:25

+2

爲了這個目的,看看Boost.optional。 – 2011-12-24 11:07:25

+0

@CharlesBailey在我看來,像方法(shared_ptr (),shared_ptr ())類似於方法(NULL,NULL)的可讀性一目瞭然。如果我理解了一些東西,你應該使用明確的臨時對象,這使得它變得更糟(我認爲)。你說得很清楚,但在某些情況下,將所有參數傳遞到單一方法而不是單獨的設置者/獲取者是更合適的。 – dschultz 2011-12-24 11:29:59

回答

5

傳遞空共享指針沒有任何問題。事實上,一個空的共享指針是一個實際的Null Object,這意味着它的設計正是爲了這些用途。

相關問題