2014-10-29 111 views
-3

這個問題只是爲了改進目的。有一個功能如下:用不同參數調用函數C++

void Func_A(u8* arg) { 
    bool local_arg=false; 
    if(!arg) { 
     //allocate memory for arg 
     local_arg=true; 
    } 
    //process arg 

我從多個地方用NULL和非NULL參數調用此函數。 我只想問,是否有更好的方法來處理這種不local_arg或不。

+1

如果你能描述'* arg'是輸入還是輸出,以及'arg'爲NULL時'Func_A'意味着什麼,這將有所幫助。 – 2014-10-29 06:12:06

+1

您可以嘗試函數的默認參數,但我不太確定這種情況對您的情況會有多大改變。 – Niall 2014-10-29 06:33:45

+2

'local_arg'在你的代碼中沒有做任何事情。你應該發佈一個更現實的例子。 – juanchopanza 2014-10-29 06:37:37

回答

0

有時你可以使用...

u8* p = arg ? arg : new u8(...); 

...do things with *p... 

if (!arg) delete p; 

小票友,您可以編寫與運行時配置的所有權的智能指針:

template <typename T> 
class Uncertain_Ownership_Ptr 
{ 
    public: 
    enum Ownership { Own_It, Dont_Own_It }; 
    Uncertain_Ownership_Ptr(T* p, Ownership own) : p_(p), own_(own) { } 
    Uncertain_Ownership_Ptr(const Uncertain_Ownership_Ptr&) = delete; 
    void operator=(const Uncertain_Ownership_Ptr&) = delete; 
    ~Uncertain_Ownership_Ptr() { if (own_ == Own_It) delete p_; } 
    T& operator*() { return *p_; } 
    const T& operator*() const { return *p_; } 
    T* operator->() { return p_; } 
    const T* operator->() const { return p_; } 
    private: 
    T* p_; 
    Ownership own_; 
}; 

...然後...

void Func_A(u8* arg) 
{ 
    Uncertain_Ownership_Ptr p(arg ? arg : new u8(...), 
     arg ? Uncertain_Ownership_Ptr::Dont_Own_It : Uncertain_Ownership_Ptr::Own_It); 

    // use *p ... 
}