11

Glib::RefPtr は ' ' 経由での逆参照を許可しますが、' ->' 経由では許可しません*。どうしてこれなの?

もちろんできます:

 class Foo {};
 Glib::RefPtr<Foo> fooPtr;

 fooPtr.operator->();

ドキュメントでは、特に operator*() を除外したと述べています。しかし、彼らはその理由について何のガイダンスも提供していません。

明確にするために例で編集

RefPtr を「逆参照する必要は決してない」と主張しているのを見てきましたが、動的に割り当てられたオブジェクトとスタックに割り当てられたオブジェクトの両方で使用したい関数は最小公分母インターフェイス、つまりpass- 参照。

たとえば、次の例を見てください。

struct Foo 
{ 
    void print() { printf( "Success" ); } 
};

void myFunc( const Foo & foo ) { foo.print(); }

int main()
{
    Foo               foo0;
    Glib::RefPtr<Foo> foo1Ptr( new Foo );

    myFunc(  foo0    );
    myFunc( *foo1Ptr ); // error, no operator*()

    return 0;
}

Glib チームがこの立場を取っている理由を知っている人はいますか?

4

1 に答える 1

5

一部の関数は、オブジェクトまたはオブジェクト参照を引数として受け取る場合があります。

いいえ、RefPtr を介してオブジェクトを使用する必要がある場合、RefPtr なしでは、どの関数もそのオブジェクトを使用できません (または使用すべきではありません)。operator* を持たないことで、人々がこれを行うのを避けることができます。つまり、API は強制的に正しいものになり、RefPtr を使用しないことによるメモリ管理エラーが少なくなります。人々がそれを誤用する可能性があり、人々はすでにスマートポインターのコツをつかむのに十分な時間を費やしているため、そこにはありません.

RefPtr::operator*() によって解決されると思われる実際の問題がある場合は、実際の問題に言及して、(おそらく) operator*() を実際に使用したくない方法を示すことができます。 .

于 2012-05-26T10:22:55.987 に答える