我知道C ++中扩展类的官方答案,比如Objective-C或c#"没有。但有没有什么方法可以实现这个?成本是多少?
我问这个是因为我的同事使用我的解析器从特殊格式的txt文件生成C ++类文件。他们抱怨说很难扩展课程。
我不能强迫他们使用继承,因为生成的类是这样的:
class A {}
class B : A {}
如果我的同事像这样延伸A:
class C : A {}
然后B类将不会从C类中受益。这意味着:在我们的情况下,如果class C : A
,B意味着从A继承,那么现在B应该从C继承。但这是不可能的,因为B有硬代码从A继承。这意味着,继承不是一个好的选择,真正的需求是扩展A.
在新课程中使用A作为成员也不是一种选择。由于我们的逻辑更像是" is-A"而不是" has-A&#34 ;,强制使A成为会员将使代码难以阅读。
目前他们直接修改类头文件,并且任何新的成员函数都是在新的cpp文件中实现的(感谢C ++类文件结构),所以如果类更改,原始cpp文件将重新生成,他们赢了&#39关心它,他们使用git将新生成的头文件合并到他们修改过的文件中。
我可以编写一个解析器来扫描头文件并进行合并,但编写一个解析器来完全实现C ++标准BNF(http://www.externsoft.ch/download/cpp-iso.html)是很困难的。
目前我决定使用宏,例如flex和bison使用的机制将.y文件中的操作替换为生成的c文件。但我想知道是否有一个简单的方法。
答案 0 :(得分:2)
常见的C ++解决方案是freeFunction(A&)
,而不是创建class B
。与纯OO语言不同,C ++具有不是类成员的自由函数。您的freeFunction_B(A&)
和您同事的freeFunction
_ C(A&)`不会干涉。
显然,当您需要添加数据成员时,这不是一个解决方案。在那种情况下,还有另一种选择。保持打开基类:
template<typename BASE> class B : public BASE {
// ...
}
这允许B<A>
和B<C<A>>
。轻微缺点:C<B<A>>
与B<C<A>>
的类型不同,这是合乎逻辑的。成员必须在记忆中按某种顺序排列,有两种选择。
(一般建议:代码生成和C ++?这意味着模板)
答案 1 :(得分:0)
经过一段时间的研究,我认为“猴子补丁”是我正在寻找的技术,但似乎只能使用具有反射功能的语言来实现。
当前,我在代码中使用“ has-a”扩展名而不是“ is-a”,以避免更改生成的代码。