【发布时间】:2017-05-29 12:06:04
【问题描述】:
有no feature that control visibility/accessibility of class in C++。
有没有办法伪造它?
是否有任何可以模拟最接近行为的 C++ 宏/模板/魔术?
情况是这样的
Util.h(库)
class Util{
//note: by design, this Util is useful only for B and C
//Other classes should not even see "Util"
public: static void calculate(); //implementation in Util.cpp
};
B.h(库)
#include "Util.h"
class B{ /* ... complex thing */ };
C.h(库)
#include "Util.h"
class C{ /* ... complex thing */ };
D.h(用户)
#include "B.h" //<--- Purpose of #include is to access "B", but not "Util"
class D{
public: static void a(){
Util::calculate(); //<--- should compile error
//When ctrl+space, I should not see "Util" as a choice.
}
};
我的糟糕解决方案
将Util 的所有成员设为私有,然后声明:-
friend class B;
friend class C;
(编辑:感谢A.S.H“这里不需要前向声明”。)
缺点:-
- 这是一个修改
Util以某种方式识别B和C。
在我看来这没有意义。 - 现在 B 和 C 可以访问
Util的每个成员,打破任何private访问保护。
有a way to enable friend for only some members,但它不是那么可爱,而且不能用于这种情况。 -
D只是不能使用Util,但仍然可以看到它。Util在D.h中使用自动完成(例如ctrl+space)仍然是一个选择.
(编辑)注意:一切都是为了方便编码;以防止一些错误或错误使用/更好的自动完成/更好的封装。这与反黑客或防止未经授权访问该功能无关。
(编辑,接受):
遗憾的是,我只能接受一种解决方案,所以我主观地选择了一种工作量少、灵活性大的解决方案。
对于未来的读者,Preet Kukreti(& texasbruce 发表评论)和 Shmuel H.(&ASH是评论)也提供了很好的解决方案,值得一读。
【问题讨论】:
-
使Util受保护的一个封闭类的嵌套类,B和C继承该类。
-
注意:你不需要前向声明来声明一个友元类或函数。 ("不方便:需要前向声明和好友声明")
-
@A.S.H 嘘?真的吗?看来你是对的。这对我来说是一个新知识!我会编辑问题并表扬你。谢谢!
-
然后你可以让它成为一个文件(即“内联”),就像 Java 一样,并且只将它包含在你的库的 cpp 文件中(而不是在头文件中)。不要将其头文件导出到库的包含文件夹中。就是这样。
-
@A.S.H 不错。这也是一个很好的解决方案。我会把你添加到我的跟踪列表中。
标签: c++ visual-studio-2015 class-visibility