当使用封装和“告诉,请不要问”原则正确,应该没有理由要求从一个对象的信息。 但是,我碰到一种情况(让我知道这个设计本身是否可怕),我有一个带有指向该类之外的函数的成员变量的对象。对象需要让函数访问其所有数据
在我的应用程序的某些时候,有一个需要我的对象,然后在功能和功能应该采取行动根据我的对象的状态来调用。
下面是一个例子类:
typedef void(*fptr)(Foo*);
class Foo {
public:
Foo(string name, fptr function);
void activate()
{
m_function(this);
}
private:
string m_name;
fptr m_function;
};
那类,现在开发者可以使用类像这样;
void print(Foo *sender)
{
cout << "Print works!" << endl;
}
int main(int argc, char **argv)
{
Foo foo("My foo", &print);
foo.activate();
// output: "Print works!"
}
这一切都正常,但如果我想打印发件人的名称呢? 所有函数都是由其他开发人员在类之外定义的,因此无法访问私有变量。 在C#
中,您可以使用partial
关键字将方法添加到现有类。 虽然这不可能在C++
。
我可以忽略封装和创造name
一个setter和getter和可能在将来的功能所需要的所有其他属性。 这是非常糟糕的解决方案,我应该基本上为我的课程中的所有内容创建setter和getter,因为函数可以对我的对象执行任何操作。 除了封装的原因,如果我只是想忽略它,当我想?
的其他解决办法是持有它里面所需要的性能的结构:
struct FooBar {
string name;
};
typedef void(*fptr)(FooBar);
void Foo::activate()
{
FooBar fb;
fb.name = m_name;
m_function(fb);
}
但这并不是由于没有使用封装太大的不同,它似乎并不像一个太好的解决办法。 这个问题最好的办法是什么?
请参阅[这个老问题](http://stackoverflow.com/questions/1568091/why-use-getters-and-setters)。 –
@JoachimPilborg我认为他正试图*避免* getters和setter,而不是试图找到使用它们的理由。 – 2013-06-05 12:27:43
如果你只需要观察数据,那么让吸气剂和无吸附剂似乎是最好的解决方案。您希望数据是公开还是私密。能够访问由任何人创建的函数中的数据可以有效地公开数据。 –