-1

我有以下代码,因为我们正在检查 controlPtr 类,所以我没有在 testFunc 中检查 null,而是我想返回。我正在寻找一些类似宏的东西,我可以在模板类中添加它,以便我可以使用它。(注意:我正在寻找没有例外的选项)。

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;
}
4

1 回答 1

0

有三种方法operator->:返回非 NULL 值、抛出异常或std::abort. 由于您已经排除了前两个选项,std::abort所以它是。

于 2013-03-18T14:42:44.840 回答