在C ++中通过接口的最佳方式?

时间:2012-04-13 13:54:30

标签: c++ interface

假设我有一个C ++接口

class Iface
{
public:
    virtual ~Iface () {}
    virtual void foo () = 0;
    virtual void bar () = 0;
};

我有一些类需要在一侧公开它并在其他地方实现它。我发现很常见的是我最终在中间有一堆类,基本上是这样的:

class InTheMiddleSomewhere
    : public Iface // amongst other things
{
public: // Iface
    virtual void foo () { if (impl) impl->foo (); }
    virtual void bar () { if (impl) impl->bar (); }
private:
    IfaceImpl* impl;
};

随着界面的扩展,扩散和变化,编写和维护变得令人厌烦。

问:对于完整的接口实现传递是否有更好的(或多或少自动)方式,而不是手动编写所有“if(impl)impl-> ...”的东西?

2 个答案:

答案 0 :(得分:1)

您可以将调用绑定到函数对象,然后只传递函数对象(而不是为接口的每个成员函数进行委托调用)。

请考虑以下事项:

struct I
{
    virtual R1 f1(A1, B1, ..., Z1) = 0;
    virtual R2 f2(A2, B2, ..., Z2) = 0;
    .
    .
    virtual Rn fn(An, Bn, ..., Zn) = 0;
};

现在我有一些I的实现:

struct : I
{
    ...
} x, y, z;

所以我可以调用x,y和zs函数,如:

Ri xri = x.fi(ai, bi, ..., zi);
Ri yri = y.fi(ai, bi, ..., zi);
Ri zri = z.fi(ai, bi, ..., zi);

或者我可以将调用绑定到I接口的方法,如下所示:

function<Ri(I&)> g = bind(&I::fi, _1, ai, bi, ..., zi);

然后再说:

Ri xri = g(x);
Ri yri = g(y);
Ri zri = g(z);

即使x,y和z是不同的类,只要它们来自I。

,这都有效

答案 1 :(得分:0)

我认为这是使用句柄类(Pimpl idiom)的一个缺点。是否绝对需要保持编译时间以支持违反开放/封闭原则?通常使用今天的编译器和CPU,Pimpl习惯用法的用法不像以前那么多。