したがって、それについてあらゆるところを調査した後、クラス矢印演算子を作成する方法、つまり、
class Someclass
{
operator-> () /* ? */
{
}
};
私はそれをどのように使用し、適切に使用するかを知る必要があるだけです。 -その入力は何ですか? -それは何を返しますか? -それを適切に宣言/プロトタイプ化するにはどうすればよいですか?
演算子->は、メンバーアクセスをオーバーロードするために使用されます。小さな例:
#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
矢印演算子には入力がありません。技術的には、必要なものを返すことができますが、ポインタであるか、ポインタになることができるものを返す必要があります チェーンされた_->
_演算子を介して 。
_->
_演算子は、引数を呼び出す前に戻り値を自動的に逆参照します _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->()
が単項後置演算子であるという意味です。ただし、新しい構文は導入されていないため、_->
_の後にメンバー名が必要です。
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;
}
};
「矢印」演算子は次のようにオーバーロードできます。
a->b
に翻訳されます
return_type my_class::operator->()