如果 C++ 头文件包含私有成员变量声明,它如何被视为 class 的 "interface"?
How can a C++ header file be considered a class's "interface" if it contains private member variable declarations?
在长期服用 Java 之后尝试重新学习 C++,我已经 read 了,并且还模糊地记得在头文件中声明 class 时并在 cpp 文件中定义,将其接口(h 文件)与其实现(cpp 文件)分开。
但是如果h文件包含私有成员变量声明,怎么能被认为是接口呢?成员变量的选择限制了实现,不是吗?不同的实现可能使用完全不同的变量集。
例如,一个复数 class 可以用实变量和虚变量,或者用量值和参数变量来实现,但支持相同的 getter 和 setter 集以及你有什么。
将接口与实现分离的唯一方法不是从类似于 Java 的 interface
的基础 class 继承纯虚拟吗?
没有。 Header 文件和接口是在 C++ 之前很久就用 C 构造的。在 C 地执行此操作的常用方法是通过不透明类型。 object 有一个指向定义为 char** 或 char[x] 的东西的指针,只表示你的大小,所以你看不到它。好的例子包括大多数与 Sybase 和 IBM 中间件相关的东西。不能直接'construct' objects,得通过他们的工厂方法
在 C++ 中,这通常是通过 Pimpl 模式和私有成员实现的。虽然您仍然可以看到一些位;您仍然可以针对该界面进行编程。此外,并非每种类型都会暴露给您。它不是那么干脆。
像其他任何东西一样 trade-offs。使用接口(更准确地说,它变成了模板化的 class 恕我直言)每个函数都必须为每个 child class 一遍又一遍地定义;这对 run-time 性能有好处。你也可以做一个完全由纯虚函数组成的抽象基class;这在很多方面确实是一个接口;除了你还承担了虚函数的成本 look-ups 之外,有些人不喜欢这样。
你可以争论双方的观点,直到奶牛回家......人们就这些东西写了详尽的论文。
最后,我认为您对接口是什么的理解 Java 太字面意思了。虽然 header 中通常没有具体的东西,字面意思是 "i am an interface",但它经常存在,并且可以纯粹从 header 中收集和发现。
它作为一个接口也值得注意,因为使用 header 和共享 object 你可以知道如何 'use' class 并针对它们进行编译而无需源代码。同样,它是一个接口;只是不像您在 java.
中看到的那样 "pure"
在长期服用 Java 之后尝试重新学习 C++,我已经 read 了,并且还模糊地记得在头文件中声明 class 时并在 cpp 文件中定义,将其接口(h 文件)与其实现(cpp 文件)分开。
但是如果h文件包含私有成员变量声明,怎么能被认为是接口呢?成员变量的选择限制了实现,不是吗?不同的实现可能使用完全不同的变量集。
例如,一个复数 class 可以用实变量和虚变量,或者用量值和参数变量来实现,但支持相同的 getter 和 setter 集以及你有什么。
将接口与实现分离的唯一方法不是从类似于 Java 的 interface
的基础 class 继承纯虚拟吗?
没有。 Header 文件和接口是在 C++ 之前很久就用 C 构造的。在 C 地执行此操作的常用方法是通过不透明类型。 object 有一个指向定义为 char** 或 char[x] 的东西的指针,只表示你的大小,所以你看不到它。好的例子包括大多数与 Sybase 和 IBM 中间件相关的东西。不能直接'construct' objects,得通过他们的工厂方法
在 C++ 中,这通常是通过 Pimpl 模式和私有成员实现的。虽然您仍然可以看到一些位;您仍然可以针对该界面进行编程。此外,并非每种类型都会暴露给您。它不是那么干脆。
像其他任何东西一样 trade-offs。使用接口(更准确地说,它变成了模板化的 class 恕我直言)每个函数都必须为每个 child class 一遍又一遍地定义;这对 run-time 性能有好处。你也可以做一个完全由纯虚函数组成的抽象基class;这在很多方面确实是一个接口;除了你还承担了虚函数的成本 look-ups 之外,有些人不喜欢这样。
你可以争论双方的观点,直到奶牛回家......人们就这些东西写了详尽的论文。
最后,我认为您对接口是什么的理解 Java 太字面意思了。虽然 header 中通常没有具体的东西,字面意思是 "i am an interface",但它经常存在,并且可以纯粹从 header 中收集和发现。
它作为一个接口也值得注意,因为使用 header 和共享 object 你可以知道如何 'use' class 并针对它们进行编译而无需源代码。同样,它是一个接口;只是不像您在 java.
中看到的那样 "pure"