c ++模块与接口在同一文件中时隐藏实现详细信息? 我正在阅读Bjarne Stroustrup的C ++之旅(第三版),该游览简要介绍了C ++ 20功能。在书中,他展示了出口模块如何消除...

问题描述 投票:0回答:0
的C ++巡回演出(
3RD
版),该巡回赛简要介绍了

C++20功能。在这本书中,他展示了export module如何elimiNATINE传统的模式,必须将声明和定义定义为单独的标题(.h)和源(.cpp)文件

。在他的书中,他介绍了一个自制的
vector班级模块,以解释他的观点: export module Vector; // defining the module called "Vector" export class Vector { public: Vector(int s); double& operator[](int i); int size(); private: double* elem; // elem points to an array of sz doubles int sz; }; export bool operator==(const Vector& v1, const Vector& v2) { if (v1.size() != v2.size()) return false; for (int i = 0; i < v1.size(); ++i) { if (v1[i] != v2[i]) return false; } return true; } //Implementations; Supposed to be hidden Vector::Vector(int s) : elem{new double[s]}, sz{s} {} double& Vector::operator[](int i) { return elem[i]; } int Vector::size() { return sz; }
传统上,我们必须进行
Separate
标头文件以揭示功能签名(以便我们的图书馆的消费者知道如何调用它们)和
.cpp
文件以隐藏实现。 
ever

,带有模块,看起来像是所有的文件都位于同一文件中。 my my
问题是:在单个模块文件中使用
export

实际上如何对库用户隐藏实现?如果实现与接口相同的文件中,难道不让用户(或任何消费编译器)通过简单地查看模块文件来“查看”所有内容? 要换句话说,如果我将所有内容(公共界面和私人实现都放在一个模块文件中),我该如何实际上从客户端删除我的私人代码声明等。不需要基于文本的标头文件吗?

我特别担心封闭源库的实际分发。
    
我刚刚浏览了我的C ++库,包括Stroustrup的书籍。没有人提及隐藏实现详细信息是课程或模块的原因。我意识到这通常是原因,但它比真实更神话。这是在与C ++一起工作30多年之后。 模型完全说明了相反的情况。所有详细信息都存在于标题文件中。模板和非模板代码使用“实现指针”(PIMPL)技术隐藏实现。这再次掩盖了类是为了隐藏实施的想法,因为您必须努力使用此技术。 正常类的确隐藏了实现详细信息,因为成员定义可以在源文件中,并在标题中发表声明。这是次要效应,因为单独汇编的主要目的是提高编译速度。具有接口和实现文件的模块也是如此。

a库隐藏了实现详细信息,因为它具有接口的标头文件和用于实现的二进制文件。如果在单独的文件中完成实现,则模块将执行相同的操作。

重要的是要注意,“隐藏”通常是避免用户“取决于”实现的感觉,而不是必经可能避免可见的细节。 如果您需要一个模块,而没有逐字化的实现详细信息,则实际上您不能使用单个文件来放置封闭信息和接口。该解决方案针对不同的用例。

换句话说,您
-May

使用此功能,这也意味着您

-maynot使用它。

c++ header language-lawyer c++20 c++-modules
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.