私が完全に間違っていない限り、ゲッター/セッター パターンは、次の 2 つの目的で使用される一般的なパターンです。
getVariable
メソッドを提供するだけで (または、まれに、メソッドを提供するだけで、変更可能になるだけで)プライベート変数を使用できるが変更できないようにすることsetVariable
。- 将来、変数がクラスに出入りする前に変数を処理することが適切な解決策であるという問題が発生した場合、実際の実装を使用して変数を処理できることを確認する単に値を返したり設定したりするのではなく、getter および setter メソッドで。そうすれば、変更は残りのコードには反映されません。
質問 #1: アクセサーを使用していませんか、それとも私の仮定が間違っていますか? 私がそれらについて正しいかどうかはわかりません。
質問 2: メンバー変数のアクセサーを書かなくて済むようなテンプレートの利点はありますか? 何も見つかりませんでした。
質問 #3: 次のクラス テンプレートは、アクセサーを実際に記述せずにゲッターを実装する良い方法でしょうか?
template <class T>
struct TemplateParameterIndirection // This hack works for MinGW's GCC 4.4.1, dunno others
{
typedef T Type;
};
template <typename T,class Owner>
class Getter
{
public:
friend class TemplateParameterIndirection<Owner>::Type; // Befriends template parameter
template <typename ... Args>
Getter(Args args) : value(args ...) {} // Uses C++0x
T get() { return value; }
protected:
T value;
};
class Window
{
public:
Getter<uint32_t,Window> width;
Getter<uint32_t,Window> height;
void resize(uint32_t width,uint32_t height)
{
// do actual window resizing logic
width.value = width; // access permitted: Getter befriends Window
height.value = height; // same here
}
};
void someExternalFunction()
{
Window win;
win.resize(640,480); // Ok: public method
// This works: Getter::get() is public
std::cout << "Current window size: " << win.width.get() << 'x' << win.height.get() << ".\n";
// This doesn't work: Getter::value is private
win.width.value = 640;
win.height.value = 480;
}
私には公平に見えますし、get
他の部分的なテンプレート特殊化のトリックを使用してロジックを再実装することもできます. 同じことが、ある種の Setter または GetterSetter クラス テンプレートにも適用できます。
あなたの考えは何ですか?