除非我完全弄错了,否则 getter/setter 模式是用于两件事的常用模式:
- 制作一个私有变量,以便它可以使用,但不能修改,只提供一个
getVariable
方法(或者,更罕见的是,只可修改,只提供一个setVariable
方法)。 - 为了确保将来,如果您碰巧遇到一个问题,一个好的解决方案只是在变量进入和/或退出类之前对其进行处理,您可以通过使用实际实现来处理变量在 getter 和 setter 方法上,而不是简单地返回或设置值。这样,更改不会传播到代码的其余部分。
问题 #1:我是否遗漏了对访问器的任何使用,或者我的任何假设是否不正确?我不确定我是否正确。
问题 #2:是否有任何模板优点可以让我不必为我的成员变量编写访问器?我没有找到。
问题 #3:下面的类模板是否是实现 getter 而无需实际编写访问器的好方法?
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 类模板。
你怎么认为?