我有以下情况:
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 内部而不是从 B 内部访问 A 的所有方法的能力在 MyFramework 之外。
重申一下,我有一个全部在同一个命名空间内创建的框架,并且每个类都有对使用该框架的公众有用的方法。然而,每个类也有一些方法使公共(public) API 复杂化,但框架正常运行需要这些方法。
最佳答案
I want the
some_function_I_want_B_to_use
to not be visible outside of theMyFramework
namespace, but I do want it to be visible to anyone inside ofMyFramework
.
总之,您需要类似于 Java 中的包的东西。
不幸的是,对于命名空间,这不是不可能的。命名空间中包含的每个类都可以从命名空间的外部访问:命名空间是开放的。
解决方案通常是为实现细节添加另一个命名空间:
namespace MyFramework
{
// Implementation details
// Should not be used by the user
namespace detail
{
class A
{
public:
void func();
};
}
class B
{
public:
B()
{
A a;
a.func();
}
};
}
不要忘记添加注释,说明用户不使用 detail
命名空间。
关于c++ - 命名空间级访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511959/