基类邪恶 -

时间:2015-03-30 11:56:20

标签: c++ polymorphism

观看Sean Parent在"Base class of evil"上的谈话,我在工作中看了一些自己的代码和代码。当我尝试将肖恩父母的想法应用于他们时,我可以从我能看到的两个选项中留下。公开我的成员变量,或者只是将函数回调到类的成员变量。

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

// or

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

我不喜欢其中任何一个的想法,一方面我暴露了那些不应该那么废弃的成员。而另一方面,我似乎已经创建了一大堆似乎只做间接的功能。这看起来有点乱。

现在我喜欢这个谈话并且一般都讨厌这些产生的结构,但是我不确定我能说服工作中的人们编写100个似乎应用间接的功能是值得的。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您使用friend。您正在实施一个概念上属于的外部函数,它完全合理地使用了该关键字,并且不会不恰当地暴露任何内容。

先生。家长使用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;
}