2013-03-18 38 views
-1

我有以下代碼我沒有在testFunc中檢查null,因爲我們在controlPtr類中檢查,而不是我想返回。我正在尋找一些可以在模板類中添加的宏,以便我可以在函數中使用。 (注意:我正在尋找沒有例外的選項)。在模板類C++中使用宏檢查空值

void AssertErrorHandler(const char* file_name, unsigned line_number, const char* message) { 
    std::cout << message << " in file " << file_name << " #" << line_number << std::endl << std::flush; 

}

#define CONTROLASSERT(condition, msg)     \ 
    if(!(condition)) {        \ 
     std::ostringstream s;      \ 
     s << msg;         \ 
     AssertErrorHandler(     \ 
      __FILE__, __LINE__, s.str().c_str()); \ 
    } 

template <typename T> 
class ControlPtr { 
    public: 

    explicit ControlPtr(T* p = NULL) 
    : ptr_(p) { 
    } 

    T* Get() const {       
     return ptr_; 
    } 

    ControlPtr<T>& operator=(T* p) { 
     ptr_ = p; 
     return *this; 
    } 

    T* operator->() const {      
     CONTROLASSERT(ptr_ != NULL, "Attempt to use operator -> on NULL pointer."); 
     return ptr_; 
    } 

    T& operator*() const { 
     CONTROLASSERT(ptr_ != NULL, "Attempt to use operator * on NULL pointer."); 
     return *ptr_; 
    } 

private: 
    T* ptr_; 
}; 

void testFunc() { 

    int i = 10; 
    ControlPtr<int> ptr(NULL); // Question: From here I should return. How can I modify controlPtr class above 
           // Do I use #define macro 

    std::cout << *ptr << std::endl; 

    return; 

} 


int main(void) 
{ 
    testFunc(); 
    return 0; 
} 
+0

您從不使用'#define'宏... – 2013-03-18 13:12:56

+4

拋出異常?這就是他們的目的......在你的構造函數檢查指針是否爲空,如果是這樣的話...... – Nim 2013-03-18 13:18:56

+0

我正在尋找與例外,任何其他替代目前 – venkysmarty 2013-03-18 13:27:17

回答

0

有三種出路的operator->:返回一個非NULL值,拋出一個異常,或std::abort。既然你已經排除了前兩個選項,那就是std::abort