-1

C ++でカスタムnullポインタ例外をスローする簡単な方法はありますか? 私の考えは、thisポインターを再定義することでしたが、3 つの問題があります。

  1. 使用しないと、this標準の Access Violation Exception がスローされます
  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();
    }
    
4

1 に答える 1

6

thisになることは決してないため、nullptrコンパイラは をthis != nullptrと同じように自由に扱うことができtrueます。あなたがやろうとしていることは、根本的に意味がありません。未定義の動作をキャッチするために例外を使用することはできません。唯一の方法は、未定義の動作をthis使用することです。nullptr

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

a の逆参照nullptrは未定義の動作です (8.3.2)。これは、未定義の動作をキャッチするために例外を使用しようとしています。基本的に、C++ ではそれを行うことはできません。

これが定義されていない明らかな理由の 1 つとして、次のことを考慮してください。

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?
于 2013-01-15T18:32:30.733 に答える