邪恶的基础阶层
Base Class Of Evil -
观看Sean Parent关于"邪恶基类"的演讲,我查看了一些自己的代码和工作中的代码。当我试图将Sean Parents的想法应用到他们身上时,我只能从我所看到的两个选择中选择。公开我的成员变量,或者只让函数回调到类的成员变量。
void draw(const Foo &foo)
{
foo.draw();
}
// or
void draw(const Foo &foo)
{
// access foo's members to draw
}
我不喜欢这两种想法,一方面,我暴露了一些成员,他们不应该真的这么废。另一方面,我似乎创建了一大堆函数,它们似乎只是做间接操作。看起来有点乱。
现在我喜欢这个演讲,通常也讨厌生成的这些结构,但我不确定我能不能说服工作中的人,写100个似乎只应用间接的函数是值得的。
我错过什么了吗?
您使用friend
。您正在实现一个外部函数,该函数在概念上属于类,这是对关键字的完美合理使用,不会不适当地公开任何内容。
Mr。家长使用friend
内联,我不知道这是可能的。他从来没有碰过它,所以我一开始没有抓住它。我必须向自己证明这确实有效。。。
#include <stdio.h>
class Foo
{
public:
Foo() : val(5) {}
friend void draw(Foo const & a)
{ printf ("%dn", a.val); } // You can implement friends inline?!
private:
int val;
};
int main (void)
{
Foo my_foo;
draw(my_foo);
return 0;
}