C++ 邪恶的底层-

C++ 邪恶的底层-,c++,polymorphism,C++,Polymorphism,看着肖恩家长在网上的演讲,我看了一些我自己的代码和工作中的代码。当我试着把肖恩父母的想法应用到他们身上时,从我所看到的情况来看,我只有两个选择。公开我的成员变量,或者让函数回调到类的成员变量 void draw(const Foo &foo) { foo.draw(); } // or void draw(const Foo &foo) { // access foo's members to draw } 我不喜欢这两个想法,一方面,我暴露了一些成员,他们不应

看着肖恩家长在网上的演讲,我看了一些我自己的代码和工作中的代码。当我试着把肖恩父母的想法应用到他们身上时,从我所看到的情况来看,我只有两个选择。公开我的成员变量,或者让函数回调到类的成员变量

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

// or

void draw(const Foo &foo)
{
   // access foo's members to draw
}
我不喜欢这两个想法,一方面,我暴露了一些成员,他们不应该真的如此废弃这一个。另一方面,我似乎已经创建了一系列的函数,它们似乎只是做间接的操作。看起来有点乱

现在我喜欢这个演讲,也确实讨厌这些生成的结构,但我不确定我能不能说服工作人员,写100个似乎只是间接应用的函数是值得的


我错过什么了吗?

你用
朋友
。您正在实现一个在概念上属于类的外部函数,它是对关键字的完全合理的使用,不会不适当地公开任何内容

家长先生使用
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;
}
#包括
福班
{
公众:
Foo():val(5){}
朋友无效提款(Foo const&a)
{printf(“%d\n”,a.val);}//您可以内联实现好友吗?!
私人:
int-val;
};
内部主(空)
{
福我福;
画画(我的小福);
返回0;
}

您可以通过添加原始演讲的链接来改进您的问题。或者简短地解释演讲内容,因为您真的无法将此作为真正的一般性演讲。虚构的例子会把你推到A或B,但现实世界很少如此清晰。对于第二种情况,我将避免暴露内部状态,但对于第一种情况,您可能会以20个方法结束,这些方法只是转发到其他方法(类之间具有高度耦合)。您还可以引入第二个对象(Foo专用,然后可以完全访问其状态)。此外,您还具有非成员函数(以防万一)。C++是非常灵活的,但是…我会逐个判断这个例子。如果是一个成员函数,那么它是一个成员函数,而不是暴露数据成员。如果使用类的公共接口,则免费函数可能是一个不错的选择。无论如何,当概念准备就绪时,它们在这方面会有很大帮助。现在,Boost.TypeErasure是一个用于删除大量样板文件的库。给出的答案实际上取决于上下文。例如,您可以创建一个新的“decorator”类,该类具有绘制其中一个或两个的函数,这样它们就不会紧密耦合。这似乎是最好的方法。