从类继承时,只需查看层次结构即可了解强加给您的要求和限制。例如,您可以通过查看父类(es)需要定义哪些方法(纯虚拟)来查找。如果选择使用模板(如果它适合账单)那么事情就不那么清楚了。模板类的方法可能需要使用type
的几种方法。
我遇到了一个我必须使用的复杂类。我不知道我的type
(类/对象)应该有什么方法。我能找到的唯一方法是编译编译器让我知道哪些方法是预期的。这就像从一个抽象类继承而无需访问头文件。这有点痛苦,因为弄清楚方法规范(签名)是耗时的。
现在,该类的原始设计者可以提供一些文档,说明预期存在哪些方法及其签名,但我不禁想知道是否有一种方法可以自我记录代码(或者是已经和我不知道如何查看它?)。编译和查看错误不是唯一的方法,可以吗?
答案 0 :(得分:4)
您实际上是通过为程序员提供在编译时强制执行type
的要求的方法来描述C++0x concepts要解决的问题。但是,由于时间限制,它于2009年7月被删除。
Boost中只有一个名为Concept Check Library(BCCL)的库解决方案。但是,BCCL和C ++ 0x概念之间的there are differences。它与我们对当前语言的概念最为接近。
如果您不想使用BCCL,那么文档是下一个最好的选择。
答案 1 :(得分:1)
C ++ 11中有concepts的提案可以解决这个问题:概念本质上是模板参数必须满足的接口的描述。如果你现在需要它,你可以从Boost Concept Check Library获得类似的功能,但是必须设计一个类从一开始就使用概念断言,所以如果你有一个现有的库你就不走运了。
答案 2 :(得分:1)
C ++ 11添加了static_assert(可以通过BOOST_STATIC_ASSERT在C ++ 03中模拟)。现在你可以编写很多这样的断言,这些断言将在编译时触发,并为其添加人类可读的文档,说明断言触发的原因。根据你必须测试的设备(即C ++ 11 type_traits或者只有boost.type_traits),你可以做更多或更少的事情(也考虑使用decltype来检查做某些事情的可能性,也许与sizeof技巧相结合) ,很难说通用)
答案 3 :(得分:0)
使用合成和纯虚拟类可以避免此问题。使用和理解界面更容易。了解实现如何实现接口更容易。单元测试更容易。
struct B {
virtual ~B() {}
virtual void foo() const = 0;
virtual void bar() const = 0;
};
struct D : public B {
virtual ~D() {}
virtual void foo() const {foo_thing.call();}
virtual void bar() const {bar_thing.call();}
private:
some_foo_like_thing foo_thing;
some_bar_like_thing bar_thing;
};
我希望谈论在纯虚拟界面中应该和不应该是什么应该更容易,尽管里程可能会有所不同。 ;)
欣赏某些东西所需的信息越多,理由就越难。如果你的类依赖于它的父类的实现,那么你基本上必须理解它和它的每个前辈。不仅是界面,还有实施。
如果我要设计一种语言,实现继承甚至都不是一种选择。