だから、それのためにどこでも研究した後、私はすなわち、クラス矢印演算子を作成して使用するにはどうすればよいですか?
class Someclass
{
operator->() /* ? */
{
}
};
、クラス矢印演算子を作成する方法を見つけることができないよう、私はちょうどそれと協力し、適切にそれを使用する方法を知っておく必要があります。 - 入力は何ですか? - 返品は何ですか? - 正しくプロトタイプを宣言するにはどうすればよいですか?
だから、それのためにどこでも研究した後、私はすなわち、クラス矢印演算子を作成して使用するにはどうすればよいですか?
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
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->()
'return_type {} - >() - >() - >()... - >()'は有効なコードでなければなりません。 – alfC
矢印オペレータには入力がありません。技術的には、それはあなたが望むものを返すことができますが、ポインタかポインタになることができるものを返すべきですthrough chained ->
operators。
あなたは以下のクラスを持つことができるように->
オペレータは自動的に、operator*
、内蔵のポインタ参照を使用してその引数を呼び出す前に、その戻り値ではなく逆参照:
class PointerToString
{
string a;
public:
class PtPtS
{
public:
PtPtS(PointerToString &s) : r(s) {}
string* operator->()
{
std::cout << "indirect arrow";
return &*r;
}
private:
PointerToString &r;
};
PointerToString(const string &s) : a(s) {}
PtPts operator->() const
{
std::cout << "arrow dereference\n";
return *this;
}
string &operator*() const
{
std::cout << "dereference\n";
return a;
}
};
は次のようにそれを使用します
string::size_type size = (*ptr.operator->().operator->()).size();
:にコンパイラによって変換さ PointerToString ptr(string("hello"));
string::size_type size = ptr->size();
(と実際のポインタを返すために、必要に応じて.operator->()
など多くの)と出力
arrow dereference
indirect dereference
dereference
注意は、しかし、あなたは次の操作を行うことができなければならないこと:Stroupstrupから
PointerToString::PtPtS ptr2 = ptr.operator->();
:
をオブジェクトの変換pポインタへの変換
p.operator->()
は、メンバーに依存しませんmを指します。これは、operator->()
が単一の後置演算子であるという意味です。しかし、新しい構文が導入されていないので、入力がなければ、会員名は依然として必要です。
まともなコンパイラでこのコードをコンパイルする方法はありません。 –
@SebastianRedl、あなたは正しいです。私は説明とサンプルをコンパイルするように更新しました。 –
入力がありません。戻り値の型はポインタでなければなりません。これは通常 "スマート"ポインタを作成するために使用されるため、ラップされたオブジェクトへのポインタを返します。 – Tim