C ++类扩展技术

时间:2018-03-29 04:20:11

标签: c++ compiler-construction yacc

我知道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文件。但我想知道是否有一个简单的方法。

2 个答案:

答案 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”,以避免更改生成的代码。