基地 Class 邪恶 -

Base Class Of Evil -

看着 Sean Parent 在 "Base class of evil" 上的演讲,我看了一些自己的代码和工作中的代码。当我尝试将 Sean Parents 的想法应用到他们身上时,我只剩下两个选择。公开我的成员变量,或者只是让函数回调到 class 的成员变量。

void draw(const Foo &foo)
{
   foo.draw();
}

// or

void draw(const Foo &foo)
{
   // access foo's members to draw
}

我不喜欢其中任何一个的想法,一方面,我暴露了那些不应该真正废弃那个的成员。另一方面,我似乎已经创建了一大堆似乎只是间接调用的函数。好像有点乱。

现在我喜欢这个演讲,并且通常讨厌这些生成的结构,但我不确定我能否说服工作中的人,让他们相信编写 100 个似乎只是应用间接的函数是值得的。

我是不是漏掉了什么?

您使用friend。您正在实现一个外部函数,该函数在概念上 属于 到 class,这是对关键字的完美使用,不会不适当地公开任何内容。

先生Parent 使用 friend 内联,我不知道这是可能的。他从来没有碰过它,所以我一开始没听清楚。我必须向自己证明这确实有效...

#include <stdio.h>

class Foo 
{
  public:
    Foo() : val(5) {}

    friend void draw(Foo const & a)
    { printf ("%d\n", a.val); } // You can implement friends inline?!

  private:
    int val;

};

int main (void)
{
  Foo my_foo;
  draw(my_foo);
  return 0;
}