-1

controlPtr クラスでチェックしているため、null の testFunc をチェックインしない次のコードがあります。代わりに、戻りたいと思います。関数に含めることができるように、テンプレートクラスに追加できるマクロのようなものを探しています。(注:例外なくオプションを探しています)。

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

の3つの方法がありますoperator->:NULL以外の値を返す、例外をスローする、またはstd::abort。最初の2つのオプションを除外したので、std::abortそうです。

于 2013-03-18T14:42:44.840 に答える