質問
この質問に答えはこちら
取り扱って大きなコードベースを使用する以下の構築を通して
class MyClass
{
public:
void f(int x);
private:
int x;
};
void MyClass::f(int x)
{
'
'
this->x = x;
'
'
}
個人的に、私が常に使用されている。形
class MyClass
{
public:
void f(int x);
private:
int _x;
};
void MyClass::f(int x)
{
'
'
_x = x;
'
'
}
その理由も後者の原理を応用することで、より簡潔(コード=可能性は少ないバグ)、という複数の変数の名前と同じ範囲を同時にできる動きが出始めている。とはいえ、私の元利用おります。が上振れる第二のアプローチと私は知らなか?(例:効果をコンパイル時間のご使用は、分子を鋳型としたコードなど)のメリットについてのアプローチ重要な十分なメリットは、refactorのですか?私は、がんの第二のアプローチの現在のコード、関連するリスクの導入をさらにバグがない非常にメリットは、refactor.
解決
お使いのバージョンは、ビットクリーナーがりますので、無理に押し込まないでい:
- 避け先のアンダースコア:_xまでok誰かを選択_MyFieldは、予約の名前です。最初のアンダースコアおよ字が許可されないとして変数の名前です。参照: そのルールをアンダースコアはC++の識別子?
- の属性をプライベートあるいは保護された:の変更がで統んおートセッターを使用します。
- は、この物語は、利用、例えば、分子を鋳型としたコードのフィールド名に依存型を解決できるのは一部のルックアップ困難な状況にあると思います。
小さな例の名前解決する固定による明示的にこの->(試g++3.4.3):
#include <iostream>
#include <ostream>
class A
{
public:
int g_;
A() : g_(1) {}
const char* f() { return __FUNCTION__; }
};
const char* f() { return __FUNCTION__; }
int g_ = -1;
template < typename Base >
struct Derived : public Base
{
void print_conflicts()
{
std::cout << f() << std::endl; // Calls ::f()
std::cout << this->f() << std::endl; // Calls A::f()
std::cout << g_ << std::endl; // Prints global g_
std::cout << this->g_ << std::endl; // Prints A::g_
}
};
int main(int argc, char* argv[])
{
Derived< A >().print_conflicts();
return EXIT_SUCCESS;
}
他のヒント
「この」はこの用法は、Microsoft C#のコーディング標準によって奨励されています。それは良いコードの明瞭さを与え、M_または_またはメンバ変数で何か他のものの使用を超える標準であることを意図している。
正直なところ、私は本当にとにかく名前にアンダースコアを嫌い、私は一つの「M」で私のすべてのメンバーを前に付けるために使用されます。
多くの人がこれを使用ます。
私はBCBで行う知っています。
私はあなたの名前の競合を提供例は例外だと思います。 Delphiではしかし、スタイルガイドラインは、まさにこの問題を回避するためのパラメータの接頭辞(通常は「A」)を使用します。
私の個人的な感情は、既存のコーディング規約を戦うことは、あなたがやるべきではない何かがあるということです。サッター/アレキが自分の著書「C ++コーディング規約」にそれを置くよう:小さなことにくよくよしないでください。誰もが先頭に「this->」または「_」または何があるかどうか、どちらか一方を読み取ることができます。
ただし、命名規則の一貫性は、あなたが一般的に必要ないものですので、いくつかの範囲(少なくとも、ファイルスコープ、もちろん理想的に全体のコードベース)で1つの大会にこだわることは良いプラクティスと考えられています。あなたはこのスタイルは、より大きなコードベース全体で使用されていることを述べたので、私は別の規則を改造することはかなり悪い考えだと思います。
あなたが、結局、それを変更するための十分な理由があると判明した場合は、手動でそれをしません。最良のケースでは、あなたのIDEには、「リファクタリング」のこれらの種類をサポートしています。それ以外の場合は、それを変更するためのスクリプトを書きます。検索と最後のオプションでなければなりません交換してください。いずれにせよ、あなたは、バックアップ(ソースコントロール)および自動試験設備のいくつかの種類を持っている必要があります。そうしないとあなたがそれを楽しんでいることはありません。
このようにし「この」を使用すると、IMOコードのにおいではなく、単に個人的な好みです。したがって、システム内のコードの残りの部分との整合性と同様に重要ではありません。このコードが矛盾している場合は、他のコードと一致するように変更することができます。それを変更することにより、あなたは残りのコードの大部分矛盾を導入する場合は、それは非常に悪いです、私は一人でそれを残してます。
あなたは今まで誰かが他の誰かが後で戻って変更するさまざまな味と一緒に来ることだけのために、それは「素敵」に見えるように純粋に何かを変更するコードのテニスをするの位置に取得する必要はありません。
私は使用してください m_ 命名規約に従います。私は嫌い"ハンガリー"の表記は一般的に、見たいので非常に有用な見合うクラス会員データです。また、2つ同じ変数名が同じ範囲もエラーに陥りやすい。
私は同意するものとします。私は、その命名規則を好きではない - 私は、メンバ変数とローカル変数の間に明確な区別があるものを好みます。あなたがthis
をオフに残した場合はどうなりますか?
class MyClass{
public:
int x;
void f(int xval);
};
//
void MyClass::f(int xval){
x = xval;
}
私の意見では、のこののコードに混乱を追加する傾向があるので、私は別の変数名(慣例に応じて、それはアンダースコアであるかもしれない、のメートルを使用する傾向がある_ の、何でも)。
class MyClass
{
public:
int m_x;
void f(int p_x);
};
void MyClass::f(int p_x)
{
m_x = p_x;
}
...スコープ接頭辞を使用して、私の好ましい方法です。グローバルための部材で、パラメータのP_(代わりに、引数の一部の使用A_)、G_ためM_、それは読みやすさを助けている場合、時には地元のためにL_。
あなたは、これは多くのことを助けることができると同じ名前に値するだけの再定義を避けるために、その意味でいくつかのランダムな変動を補うためにならないことを回避する2つの変数を持っている場合。またはさらに悪いことに、恐ろしい 'X2、X3、X4、など' ...
<ストライキ> これは、初期化子を使用して建設に初期化されるメンバーのためにC ++でより正常なのです。ストライキ>
<ストライキ>これを行うには、あなたはメンバ変数の名前に別の名前を使用する必要があります。
だから、にもかかわらず、私はC ++ではないだろう、JavaでFoo(int x) { this.x = x; }
を使用すると思います。
本物の香りではなくthis -> x
自体の使用よりもメンバ変数を、変異以外の何もしない初期化子および方法の使用の欠如かもしれません。
<ストライキ> ストライキ>
それは初期化子で使用しているとき、私はメンバ変数へのコンストラクタの引数に別の名前を使用することにしてきたすべてのC ++店で普遍的な練習は、理由は誰もが知っていますか?それをサポートしていませんでしたいくつかのC ++コンパイラがありましたか?
今日、ほとんどのIDEのエディタの色、あなたの変数は、ローカル変数のクラスのメンバーを示します。このように、IMO、どちらの接頭辞や 'this->' 読みやすくするために必要とされなければならない。
私はそれは隔世遺伝だから「この」を使用して好きではありません。あなたは古き良きC(Cを覚えていますか?)でプログラミングしている、とあなたはOOPの特性の一部を模倣したい場合は、複数のメンバーを持つ構造体を作成します(これらは、あなたのオブジェクトのプロパティに類似している)、あなたはセットを作成します全ては、それらの最初の引数(これらは、そのオブジェクトのメソッドに類似している)ように、その構造体へのポインタを取る。
関数の(私はこのtypedefの構文が正しいことだと思うが、それはしばらくしている...)
typedef struct _myclass
{
int _x;
} MyClass;
void f(MyClass this, int x)
{
this->_x = x;
}
実際、私は、古いC ++コンパイラは、実際に上記のフォームにあなたのコードをコンパイルしてからちょうどCコンパイラに渡すと考えています。言い換えれば - ある程度C ++は単なる糖衣構文ました。だから私は、誰もがC ++でプログラミングし、明示的に「この」コードでの使用に戻りたいと思う理由はわからない - 多分それは、「構文Nutrisweet」
ですあなたが命名規則に問題がある場合は、folowingのようなものを使用しようとすることができます。
class tea
{
public:
int cup;
int spoon;
tea(int cups, int spoons);
};
または
class tea
{
public:
int cup;
int spoon;
tea(int drink, int sugar);
};
私はあなたのアイデアを得たと思います。それは基本的に異なるが、論理的な意味で「同じ」変数の命名です。私はそれが役に立てば幸います。