web-dev-qa-db-ja.com

クラス矢印演算子を作成して使用するにはどうすればよいですか?

したがって、それについてあらゆるところを調査した後、クラス矢印演算子を作成する方法、つまり、

class Someclass
{
  operator-> ()  /* ? */
  {
  }
};

私はそれをどのように使用し、適切に使用するかを知る必要があるだけです。 -その入力は何ですか? -それは何を返しますか? -それを適切に宣言/プロトタイプ化するにはどうすればよいですか?

23
Codesmith

演算子->は、メンバーアクセスをオーバーロードするために使用されます。小さな例:

#include <iostream>
struct A 
{
    void foo() {std::cout << "Hi" << std::endl;}
};

struct B 
{
    A a;
    A* operator->() {
        return &a;
    }
};

int main() {
    B b;
    b->foo();
}

これは出力します:

Hi
26
gr0v3r

矢印演算子には入力がありません。技術的には、必要なものを返すことができますが、ポインタであるか、ポインタになることができるものを返す必要があります チェーンされた_->_演算子を介して

_->_演算子は、引数を呼び出す前に戻り値を自動的に逆参照します _operator*_ではなく、組み込みポインター逆参照を使用するなので、次のクラスを持つことができます:

_class PointerToString
{
    string a;

public:
    class PtPtS
    {
    public:
        PtPtS(PointerToString &s) : r(s) {}
        string* operator->()
        {
            std::cout << "indirect arrow\n";
            return &*r;
        }
    private:
        PointerToString & r;
    };

    PointerToString(const string &s) : a(s) {}
    PtPtS operator->()
    {
        std::cout << "arrow dereference\n";
        return *this;
    }
    string &operator*()
    {
        std::cout << "dereference\n";
        return a;
    }
};
_

次のように使用します。

_PointerToString ptr(string("hello"));
string::size_type size = ptr->size();
_

これはコンパイラによって次のように変換されます。

_string::size_type size = (*ptr.operator->().operator->()).size();
_

(実際のポインタを返すのに必要な数の.operator->()を使用)、出力する必要があります

_arrow dereference
indirect dereference
dereference
_

ただし、次のことが可能です。

_PointerToString::PtPtS ptr2 = ptr.operator->();
_

オンラインで実行: https://wandbox.org/permlink/Is5kPamEMUCA9nvE

Stroupstrupから:

オブジェクトpのポインターp.operator->()への変換は、メンバーmがポイントされました。これは、operator->()が単項後置演算子であるという意味です。ただし、新しい構文は導入されていないため、_->_の後にメンバー名が必要です。

29
class T {
    public:
        const memberFunction() const;
};

// forward declaration
class DullSmartReference;

class DullSmartPointer {
    private:
        T *m_ptr;
    public:
        DullSmartPointer(T *rhs) : m_ptr(rhs) {};
        DullSmartReference operator*() const {
            return DullSmartReference(*m_ptr);
        }
        T *operator->() const {
            return m_ptr;
        }
};

http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading#Address_of.2C_Reference.2C_and_Pointer_operators

1
Anycorn

「矢印」演算子は次のようにオーバーロードできます。

a->b

に翻訳されます

return_type my_class::operator->()
0
Foo Bah