【发布时间】:2014-01-14 23:04:43
【问题描述】:
我知道这个网站上有很多关于循环依赖的答案,但我发现没有一个可以解决我的问题,主要是因为我的定义被内联在标题中。
我正在用 C++11 编写一个库。为简单起见,我有两个类:
-
Exception在Exception.hpp -
CallStackinCallStack.hpp。
依赖项是:
-
Exception大量使用CallStack(在声明和定义中都需要CallStack的完整类型)所以Exception.hpp包含CallStack.hpp。 -
CallStack在它的声明中根本不需要Exception。它只需要在其中一个成员定义(operator[])中抛出一个Exception(调用非默认的Exception构造函数),因此它需要一个完整类型的Exception在定义中。
我知道如果我将定义写在.cpp 文件中,我会解决问题,但是由于所有方法和构造函数的行数都不超过 2 行,因此我选择将它们定义为内联,这意味着它们需要在.hpp header 中定义。
在声明之前有一个前向声明并在声明和定义之间包含另一个标题的解决方案不起作用,正如我已经说过的,Exception 在其声明中需要一个完整的CallStack 类型.
【问题讨论】:
-
你想通过内联方法来获得什么优势?表现?避免创建和额外的文件?还有什么?
-
@DaleWilson 性能,因为方法只有 1 或 2 行长。我确实有具有更长方法的
.cpp文件。 -
不管怎样,性能影响几乎肯定不值得担心,而且,一个好的优化编译器最终可能会内联函数(参见:stackoverflow.com/questions/1626248/…)。
-
性能很关键吗?您是否已经分析了您的代码并确定内联这些方法可以为您带来显着的改进?如果两个答案都是肯定的,那么你可以做一些丑陋的事情来完成这项工作。但是,如果您不能用响亮的“是”回答这两个问题,那么@Reed 是对的,请将实现放在 cpp 文件中。 (并继续进行更有趣的挑战。)
-
@bolov:啊,但是如果您打开正确的优化,链接器可以。 (请参阅整体程序优化或类似选项。)
标签: c++ c++11 header-files circular-dependency