gpt4 book ai didi

C++类扩展技术

转载 作者:行者123 更新时间:2023-11-30 03:24:44 24 4
gpt4 key购买 nike

我知道“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”,强制将 A 作为成员将使代码难以阅读。

目前他们直接修改类头文件,任何新的成员函数都是在一个新的cpp文件中实现的(感谢C++类文件结构),所以如果类发生变化,原始cpp文件将重新生成,他们不会关心它,而他们使用 git 将新生成的头文件合并到他们修改的文件中。

我可以编写一个解析器来扫描头文件并进行合并,但是编写一个解析器来完全实现 C++ 标准 BNF( http://www.externsoft.ch/download/cpp-iso.html ) 是困难的。

目前我决定使用宏,就像flex和bison使用的机制将.y文件中的 Action 替换为生成的c文件。但我想知道是否有简单的方法。

最佳答案

一个常见的 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++?这意味着模板)

关于C++类扩展技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49547976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com