假设我有一个接口类A(只有纯虚函数的类)。另外,我有一个具体的类B,它拥有一个指向A的弱指针,并在其上调用方法。
A类和B类之间存在强耦合。基本上我希望只有B类才能在A类上调用方法。
在A,私有(纯)虚拟上声明所有方法并使B类成为朋友是否有意义。实现A的类可以自由地改变它们作为继承A的一部分实现的函数的访问。这似乎适用于用例,但我以前没有看过它。
答案 0 :(得分:0)
这是有意义的,它解决了一个设计问题,但它引发了另一个问题(你可能会认为是次要的或不是)。
在Sutter和Alexandrescu的C++ Coding Standards中,有一条准则39. Consider making virtual functions nonpublic, and public functions nonvirtual。这是有道理的。说你有
class interface {
public:
virtual void bar();
};
然后你意识到所有bar
都有一些共同点:也许你想要验证传递给它们的参数(如果它们接受参数),或者记录对所有class interface {
public:
void bar() { bar_(); }
protected:
virtual void bar_();
};
的调用。因此,指南是将其拆分为
friend
即,一种调用非公共虚拟方法的公共非虚方法。公共站点是虚拟站点的唯一网关。
问题是,在您引入bar_
之前,这是唯一的网关。然后,你没有控制权,外部类可以直接调用foo
,绕过它。
在您的情况下,您可以考虑以下因素:
假设要授予访问权限的类为interface
,接口类为interface_accessor
。写另一个类class foo;
class interface;
class interface_accessor {
private:
static void bar(interface &i);
friend class foo;
};
,它将成为网关:
interface_accessor
请注意,foo
是interface
的朋友。
现在,让interface_accessor
成为foo
的朋友,而不是class interface {
private:
virtual void bar_() {}
friend class interface_accessor;
};
的朋友:
interface_accessor
最后,实施void interface_accessor::bar(interface &i) {
i.bar_();
}
:
data