【发布时间】:2010-07-31 23:58:43
【问题描述】:
我的接口声明通常(总是?)遵循相同的方案。这是一个例子:
class Output
{
public:
virtual ~Output() { }
virtual void write( const std::vector<char> &data ) = 0;
protected:
Output() { }
private:
Output( const Output &rhs ); // intentionally not implemented
void operator=( const Output &other ); // intentionally not implemented
};
样板总是一样的:公共虚拟析构函数,一些构成实际接口的纯虚拟方法。受保护的默认 ctor,禁用复制构造和复制分配。我开始使用两个小辅助宏,它们可用于将上述内容简化为
ABSTRACT_BASECLASS_BEGIN(Output)
virtual void write( const std::vector<char> &data ) = 0;
ABSTRACT_BASECLASS_END(Output)
不幸的是,我没有找到一个只用一个宏就能做到这一点的好方法。更好的是,我想完全避免使用宏。然而,我唯一想到的是一个代码生成器,这对我来说有点矫枉过正。
在 C++ 中声明接口的最简单方法是什么 - 直接在语言中。使用预处理器是可以接受的,但我想避免使用外部代码生成器。
【问题讨论】:
-
使用例如Boost.Preprocessors 序列可以解决这个问题,为什么你会这样做?为什么要避免代码生成(例如通过代码模板等 IDE 支持)?
-
@Georg:这个团队中的大多数开发人员不使用任何 IDE,而是使用 vim/emacs/notepad++ 之类的东西。除此之外,我并不担心编写代码,而是阅读它。对于写作,我可以很容易地破解一个 vim 宏。然而,我们有十几个接口的头文件(每个接口大约有四到五个方法),一遍又一遍地看到相同的四个方法(dtor、ctor、copy ctor、赋值运算符)有点烦人。外部代码生成器(解析 IDL 左右)是可能的,但我想知道没有它们我是否可以逃脱。
-
真正的问题是为什么?您正在对与接口无关的 hte 继承类施加限制。
-
我认为没有必要显式声明一个受保护的默认构造函数。由于类是抽象的,所以无论如何也不能直接实例化。
-
@James McNellis:将其设为公共或受保护并不重要,但如果您已将复制构造函数声明为私有,则确实需要另一个用户声明的某种构造函数,否则该类将不会即使作为另一个类的基类也可以实例化。声明复制构造函数的行为将抑制编译器生成的默认构造函数。
标签: c++ interface declaration