我用库创建了一个程序。 一个库有一个接口,用于包含外部程序调用的标题:
class IDA{
private:
class IDA_A;
IDA_A *p_IDA_A;
public:
IDA();
~IDA();
void A_Function(const char *A_String);
};
然后我用Kate打开标题并放置
class IDA_A;
IDA_A *p_IDA_A;
进入公共部分。
这有用吗?!但为什么?我可以避免这种情况吗?
问候语 Earlybite
答案 0 :(得分:0)
当然这很有效。整个私有公共事物只能由编译器检查。没有运行时检查。如果库已经编译,则用户只需要库文件(共享对象)和头文件进行开发。如果您之后更改了您提到的模式中的头文件,编译器会将IDA_A
视为公共文件。
你怎么能避免这种情况?没有办法解决这个问题。如果另一个用户更改了头文件,则无法对其进行任何操作。还有一个问题:为什么要烦恼呢?如果已经编译的lib的头文件已被更改,它可能会产生非常难看的副作用。所以改变它的人也必须处理这些问题。只有一些你不做的事情。其中一个是移动库中的标题(除非您当前正在该库上开发)。
答案 1 :(得分:0)
这有用吗?!
是
但为什么?
private
,protected
和public
只是提示C +++编译器应该如何使用数据结构。如果C ++源代码不遵循这一点,那么C ++编译器就会出错,但就是这样。
它对内存布局没有任何影响。特别是C ++标准规定,类的成员变量必须按照它们在类定义中声明的顺序排列在内存中。
我可以避免吗?
没有。以同样的方式你无法避免,其他一些代码static_cast
sa(不透明)指向你的类char*
,并将其转储到文件中,完全使用vtable和所有内容。
如果你真的想避免库的用户“向内看”,你必须给它们一些句柄值,并在内部使用地图(std::map
或类似的)从句柄值中查找实际的实例。我在我开发的一些库中执行此操作,出于稳健性原因,但也因为某些编程环境存在绑定而无法正确处理指针。
答案 2 :(得分:0)
您可以访问p_IDA_A
成员变量,这总是可以按照您概述的方式进行。但它的类型为IDA_A
,您只有一个声明,而不是定义。所以你不能用它做任何有意义的事情。 (这种数据隐藏方法称为pimpl习语)。