我有以下情况:
namespace MyFramework {
class A {
void some_function_I_want_B_to_use() {}
};
class B {
B() {
some_function_I_want_B_to_use() {}
}
};
}
我希望
some_function_I_want_B_to_use
在 MyFramework
命名空间之外不可见,但我确实希望它对 MyFramework 内的任何人可见(或者,仅对 B 类可见也可以)。我有很多这样的方法,是将它们从 MyFramework 的公共(public) API 中隐藏以使 MyFramework
中的所有类成为 friend 的唯一方法吗?我还考虑将所有“低级”类放在 B 中,但我不想走这条路,直到我确定它可以实现从 B 内部访问 A 的所有方法的能力,但不能从在 MyFramework 之外。重申一下,我有一个框架,它全部在一个命名空间中创建,每个类都有对使用该框架的公众有用的方法。但是,每个类也有一些使公共(public) API 复杂化但框架正常运行所必需的方法。
最佳答案
Pimpl idiom ,通常称为 编译防火墙 ,正是您要寻找的。整个 Qt 都是使用这个习语实现的。
// A.hpp
namespace MyFramework {
class A {
private:
class Private;
Private* implementation;
};
}
// A_Private.hpp
#include "A.hpp"
namespace MyFramework {
class A::Private {
public:
void some_function_I_want_B_to_use() {}
};
}
// A.cpp
#include "A_Private.hpp"
namespace MyFramework {
A::A() {
implementation->some_function_I_want_B_to_use();
}
}
// B.hpp
#include "A.hpp"
namespace MyFramework {
class B {
B();
A a;
};
}
// B.cpp
#include "A_Private.hpp"
namespace MyFramework {
B::B() {
a.implementation->some_function_I_want_B_to_use();
}
}
注意 :当然
A_Private.hpp
不会进入你框架最终发行版的 include
目录,即它仍然是 包私有(private) 根据你的需要。这个例子非常基础。当然,它可以做得更先进和更健壮。此外, Pimpl 还有许多其他优点。有关所有这些信息,请参阅:
关于c++ - 命名空间级访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15511959/