このマクロは、コンパイラのコマンドラインパラメーターとして、グローバルヘッダーで定義することができます。
#define me (*this)
そして、いくつかの使用例:
some_header.h:
inline void Update()
{
/* ... */
}
main.cpp:
#include "some_header.h"
class A {
public:
void SetX(int x)
{
me.x = x;
me.Update();
}
void SomeOtherFunction()
{
::Update();
}
/*
100 or more lines
...
*/
void Update()
{
// ...
}
int x;
};
したがって、クラスメンバーにアクセスするときのクラスメソッドでは、常にを使用しme
、グローバル識別子にアクセスするときには常に使用します::
。これにより、コードに精通していない読者(おそらく数か月後には自分自身)に、他の場所を探す必要なくアクセスされたもののローカライズされた情報が提供されます。どこでもme
使用this->
するとうるさくてugいため、定義したいです。しかし#define me (*this)
、C ++の優れた実践と考えることができますか?me
マクロにはいくつかの実用的な問題点がありますか?また、C ++プログラマとして、me
マクロを使用するコードの読者になる場合、それを好むか好まないのでしょうか?
編集:多くの人me
がを使用して具体的に反論するのではなく、一般的にこれを明示的に反論するため。「どこでもこれを明示する」ことの利点が何であるかは明確ではないと思う。
「どこでもこれを明示する」ことの利点は何ですか?
- コードの読者として、アクセスされるものに確実性があり、検証することとは異なることに集中することができます。
- より具体的に検索機能を使用できます。「検索
this->x
」のみ検索するよりも、あなたに多くの望んでいた結果を与えることができます「x
」 - あるメンバーを削除または名前変更するとき、コンパイラーはこのメンバーが使用されている場所で確実に通知します。(一部のグローバル関数は同じ名前を持ち、明示的なthisを使用していない場合にエラーが発生する可能性があります)。
- コードをリファクタリングし、メンバーから非メンバー関数を明示的に作成すると(カプセル化を改善するため)、編集する必要がある場所が示され、非メンバー関数パラメーターとして指定されたクラスのインスタンスへのポインターに簡単に置き換えることができます
- 一般に、コードを変更するときは、明示的なthisをどこでも使用するときよりも、明示的なthisを使用しないときのエラーの可能性が高くなります。
- 明示的にこれは、外部からメンバーにアクセスしているときの明示的な「m_」よりもノイズが少ない(
object.member
vsobject.m_member
)(この点を見つける@Kazに感謝) - 明示的にこれは、すべてのメンバー(属性とメソッド)の問題を普遍的に解決しますが、「m_」または他のプレフィックスは属性に対してのみ実用的に使用できます。
このリストを洗練して拡張し、他の利点について知っているかどうか、そしてどこでも明示的なthisのユースケースを教えてください。
#define self (*this)
ですか?両方のマクロを混在させて、 VBとPythonを模倣したファイルを作成することもできます。:)
me_x
。