C ++で間接演算子を過負荷にする[重複
-
27-10-2019 - |
質問
この質問にはすでに答えがあります:
私の問題は単純なものです。動的に割り当てられたタイプへのポインターを保持するクラステンプレートがあります。 Class Templateインスタンスを - >オペレーターと呼び、まるで内部に含まれるポインターを直接使用するかのようにリダイレクトされるように、間接演算子を過負荷にしたい。
template<class T>
class MyClass
{
T *ptr;
...
// created dynamic resource for ptr in the constructor
};
何らかのタイプのmyclassを作成します:
MyClass<SomeObject> instance;
だから私が欲しいのは、入力するのではなく、次のとおりです。
instance.ptr->someMemberMethod();
私は単に入力します:
intance->someMemberMethod();
あなたも instance
ポインターではありませんそれはまるでそれがポインターであるかのように動作します instance
含む。オペレーターにオーバーロードしてそのギャップを埋める方法は?
解決
オーバーロードするだけです operator->
と operator*
:
template<class T>
class MyClass
{
T* ptr;
public:
T* operator->() {
return ptr;
}
// const version, returns a pointer-to-const instead of just a pointer to
// enforce the idea of the logical constness of this object
const T* operator->() const {
return ptr;
}
T& operator*() {
return *ptr;
}
// const version, returns a const reference instead of just a reference
// to enforce the idea of the logical constness of this object
const T& operator*() const {
return *ptr;
}
};
言語の作成者による設計上の決定により、あなたは .
オペレーター。
また、あなたはそう思うかもしれません operator*
過負荷になります 乗算 抑制オペレーターの代わりにオペレーター。ただし、乗算オペレーターは単一の引数を取得しているため(控訴演算子は引数を取得しないが)、これはそうではありません。これにより、コンパイラはどれがどれであるかを知ることができます。
最後に、それに注意してください operator->
ポインターを返しますが operator*
参照を返します。それらを誤って混乱させるのは簡単です。
他のヒント
過負荷に ->
オペレーター:
template <typename T> class MyClass
{
T * p;
public:
T * operator->() { return p; } // #1
T const * operator->() const { return p; }
};
ご了承ください 両方 過負荷はオブジェクトを変異させません。それにもかかわらず、私たちはオブジェクトのコンストネスをポーニーに遺贈するように、#1 Non-Constを作成することにしました。これは、「ディープコンスネス伝播」またはこの種の何かと呼ばれることもあります。言語Dはこれをさらに進めます。
メンバーアクセスオペレーターをオーバーロードして、アクセスするオブジェクトへのポインターを返すことができます。
T * operator->() {return ptr;}
T const * operator->() const {return ptr;}
また、ポインターのように感じるように敬意を払うことを望んでいるかもしれません。これにより、代わりに参照が返されます。
T & operator*() {return *ptr;}
T const & operator*() const {return *ptr;}