ここで簡単な質問をしたいと思います。クラスのメンバー変数はすべてプライベートですが、アクセサーを使用してポインターを返すか、変数自体を返す必要がありますか? それとも私は何か他のことをすべきですか?
例:
unsigned int *Object::GetObjectIDPointer()
{
return &objectID;
}
また
unsigned int Object::GetObjectID()
{
return objectID;
}
これは、それらで何をしたいかによって大きく異なります。クラスのユーザーがクラス内の変数を変更できるように計画している場合 (ひどいことであり、強くお勧めできません)、ポインターまたは参照を返すことができます。それ以外の場合は、変数自体を返します。
ベクトル、セット、マップなど、返すオブジェクトが大きい場合、この規則には例外があります。それらへのアクセサーを作成する場合は、定数参照によって返す必要があります。
私は、2番目の解決策を取ると思います。より一般的には、オブジェクト自体のコピーを返すことができます。コンパイラは、コピー省略最適化
で不要なコピーを最適化する可能性があります。
フィールドへの const 参照を返すこともできます。
const MyType& getMyField() const { return this->myField; }
そうすれば、コピーは作成されず、値は変更できません ( を除くconst_cast
)。
しかし、intの場合、2番目のソリューションのように、コピーを返す必要があると思います:
unsigned int Object::GetObjectIDPointer()
{
return objectID;
}
値を取得できるようにしたい場合は、値で戻ります。また、関数を宣言しますconst
。const
ただし、サイズが大きい場合やコピーにコストがかかる場合は、呼び出し元がコピーを作成しないことを選択できるように、参照を返す方がよい場合があります。
それを変更できるようにしたい場合は、参照 (または必要に応じてポインター) を返すか、「設定」関数を提供します。または、単に公開してください。カプセル化されていないのにカプセル化されているふりをしてもあまり意味がありません。
参照 (またはポインター) を返す場合は、オーバーロードがあることを確認してください。そうしないと、オブジェクトconst
から値を読み取ることができません。const
const unsigned int *Object::GetObjectIDPointer() const
{
return &objectID;
}
それはあなたの方法に依存します
GetObjectIDPointer()
プライベート メソッドの場合は、メンバーへのアクセスが高速になるため、ポインターを使用します。ただし、メソッドがパブリックの場合は、常にコピーを返す必要があります。ポインターを返すかのように、OOPS (データ隠蔽) の基本原則に違反します。