2013-01-15 63 views
-1

有沒有簡單的方法來拋出自定義空指針異常在c + +? 我的想法是重新定義this指針,但它有3個問題:C++ - 拋出自定義空指針異常

  1. 不使用this拋出標準ACCES衝突異常
  2. 指針檢查每次使用
  3. Visual Studio中顯示此爲InteliSense時間錯誤(編譯)(不知道其他的編譯器做)

    #include <iostream> 
    #define this (this != nullptr ? (*this) : throw "NullPointerException") 
    
    class Obj 
    { 
    public: 
        int x; 
        void Add(const Obj& obj) 
        { 
         this.x += obj.x; // throws "NullPointerException" 
           //x = obj.x; // throws Access Violation Exception 
        } 
    }; 
    
    
    void main() 
    { 
        Obj *o = new Obj(); 
        Obj *o2 = nullptr; 
        try 
        { 
         (*o2).Add(*o); 
        } 
        catch (char *exception) 
        { 
         std::cout << exception; 
        } 
        getchar(); 
    } 
    
+0

咦?你有編譯錯誤還是什麼? –

+0

沒有copile錯誤。程序按預期工作異常被拋出。 Visual Studio的智能(代碼輔助)表明它是無效的,但不妨礙編譯。 – EOG

+3

我個人的政策是重新定義關鍵字是狂野的西部。祝你好運! –

回答

6

由於this永遠不會是nullptr,因此編譯器可以免費對待this != nullptr,與true相同。你想要從根本上做什麼是沒有意義的。您不能使用異常來捕獲未定義的行爲。 this可能是nullptr的唯一方法是通過未定義的行爲。

Obj *o2 = nullptr; 
try 
{ 
    (*o2).Add(*o); 
} 

取消引用nullptr是未定義的行爲(8.3.2)。這是嘗試使用異常來捕獲未定義的行爲。基本上,你不能在C++中做到這一點。

對於一個顯而易見的原因,這是不確定的,想想看:

class Foo 
{ 
    public: 
    Foo { ; } 
    virtual void func() = 0; 
}; 

class Bar : public Foo 
{ 
    public: 
    Bar() { ; } 
    virtual void func() { some_code() } 
}; 

class Baz : public foo 
{ 
    public: 
    Baz() { ; } 
    virtual void func() { some_other_code(); } 
} 

... 

Foo * j = nullptr; 
j->func(); // Uh oh, which func? 
+0

如果OP已經完成了'o2-> Add(* o);'那麼會被定義,對吧?在這種情況下,它有效地檢查函數內的'this'嗎? (儘管如此,但仍然有效) – JaredC

+0

'Obj * o = new Obj();' – JaredC

+0

不,'o2'是'nullptr'。 'a-> b;'與(* a).b'相同。所以'nullptr'仍然被解除引用。見9.3.1。 –