【发布时间】:2021-10-13 15:13:53
【问题描述】:
我目前正在开展一个项目,我们有一组共享的标题。现在我们想添加一些私有字段,而不必将这些声明直接放在共享标头中。
有人提出以下问题:
namespace something {
class Foo {
public:
Foo();
void doFoo();
private:
#if __has_include("foo_private.hpp")
#include "foo_private.hpp"
#endif
};
}
在_private.hpp 标头中,我们将放置该类的私有字段。当只有默认数据类型(int、bool 等)时,这可以正常工作(ish)。但是,只要您在 _private.hpp 文件中添加一个包含,例如 #include,一切都会中断。
它给出了以下错误expected unqualified-id before ‘namespace’,据我了解,这是非常合乎逻辑的,因为您试图在类中定义命名空间。
示例 _private.hpp 文件
#ifndef DUMMY_PRIVATE_TEMPLATE_INCLUDES_FOO_PRIVATE_HPP
#define DUMMY_PRIVATE_TEMPLATE_INCLUDES_FOO_PRIVATE_HPP
#include <string>
int mySecretNumber;
std::string mySecretString;
#endif
现在我的问题是,有没有办法欺骗预处理器,或者以某种方式使用不同的解决方案获得相同的结果?
【问题讨论】:
-
请不要将 HTML/CSS/JS sn-ps 用于非 HTML/CSS/JS 代码。
-
糟糕,非常抱歉
-
可以,但不能将
#include <string>放在类定义中。Now we want add some private fields without having to put those declarations directly in the shared headers.那要么是继承,要么是 pimpl 成语。在任何一种情况下,将#include放在类定义的中间都将难以维护。 -
您要解决的实际问题是什么?您说您不希望公共标头中出现成员变量,但为什么呢?
-
如果这是试图将实现细节隐藏在一个私有的未受干扰的标头中,它注定会失败。 C++ 对象模型要求各处的所有代码都可以看到相同的类布局。 pimpl 成语可能是你应该研究的东西。
标签: c++ c-preprocessor