代码之家  ›  专栏  ›  技术社区  ›  Shabbar

如何在共享类时隐藏成员函数文件

  •  -1
  • Shabbar  · 技术社区  · 7 年前

    我正在读保罗·德特尔的《如何编程》一书。按照他的说法,我们可以制作一个不包含成员函数详细信息的文件。

    “为了隐藏类成员函数实现的详细信息,类实现程序员将向客户机代码程序员提供标题Time.h(指定类接口和数据成员)和时间目标代码(即表示时间成员函数的机器代码指令)。客户端代码程序员没有得到时间。cpp,因此客户端仍然不知道成员函数的实现时间。“”

    我在dev中开发了下面的简单代码来测试这个概念,但我不知道编译后哪个文件等效于cpp文件。

    面积等级:

    #include<iostream>
    using namespace std;
    class Area {
    
        public:
            int square(int);
    
        private:
            int x;  
    };
    

    源代码区域。包含成员功能的cpp

    #include<iostream>
    #ifndef AREA_HH
    #define AREA_HH
    # include "Area.h"
    
    int Area::square(int x)
    {
        return x*x;
    }
    
    #endif
    

    主要内容:

    #include<iostream>
    #include "Area.h"
    
    using namespace std;
    
    int main ()
    
    {
        Area Obj1;
    
        cout<<Obj1.square(4);
    
        return 0;
    }
    

    Dev创建的文件是:Area。cpp,区域。o、 区域。h、 主要。cpp,主要。o、 Makefile。win、layout和exe。

    3 回复  |  直到 7 年前
        1
  •  1
  •   patatahooligan    7 年前

    不能将类与可执行文件隔离。要共享这样的功能,您必须构建库而不是应用程序。要理解为什么在构建项目时找不到一个保存类的独立文件,您必须了解构建是如何工作的。

    C++应用程序的标准结构可以看到跨翻译单元(.cpp文件)的功能划分。这些文件包含函数的定义。为了从其他翻译单元使用这些函数,函数声明需要对这些单元可见。因为我们不想 include 所有的。我们需要的cpp文件,我们通常将声明分离到头文件(.h或.hpp)中。例如:

    圆圈h:

    // This is where you would put an include guard (NOT IN THE CPP FILE)
    
    struct Circle {
        // Note that member variables need to be visible in the header
        float radius;
        float area();
    }
    

    圆圈cpp公司

    float Circle::area() {
        return 2.0 * PI * radius;
    }
    

    主要的cpp公司

    #include "Circle.h"
    
    int main() {
        Circle c;
        c.radius = 5.0;
        float area = c.area();
    }
    

    构建项目时,编译器将为每个翻译单元输出一个目标文件,例如Circle。o和main。o、 因为编译器一次只能在一个翻译单元(cpp)上工作,所以它们不是自包含的。例如,在main中。o参考 c.area() 这一问题尚未解决。因为函数的签名可以通过included获得。h文件,编译器知道如何调用它,但不知道如何查找它。链接器将获取所有对象文件并将它们链接到单个可执行文件中,例如MyProject。exe。

    因此,在标准C++应用程序中,没有“等效于cpp文件”。中间产物。o不打算在其他项目和MyProject中共享和包含。exe只是一个可执行文件。

    您实际上需要做的是构建一个库。这是一种非独立应用程序的可执行文件形式。那么链接器的最终输出将是。dll。库。左右。a(取决于平台和链接方法),它将以可执行(而非源)形式保存所有函数实现。然后,您可以将库与您的一起分发。h文件,并让人们链接到该文件。

    同样,没有“等效cpp”文件。生成的库将包含您指定为输入的所有转换单元,因为生成过程与上述非常相似。不同之处在于,输出将不是一个可执行的应用程序,而是一个库,根据需要,将从另一个链接到此库的应用程序中调用函数。

    建立图书馆没有统一的方法。当您使用IDE时,它可能会成为创建新项目时的一个选项。

        2
  •  1
  •   R Sahu    7 年前

    我不知道编译后哪个文件等效于cpp文件。

    它是实现中声明的函数的文件。h文件。在您的情况下,它是“Area.cpp”。

        3
  •  0
  •   Useless    7 年前

    实现源代码为 Area.cpp ,并将其编译为文件中的实现目标代码 Area.o

    如果要分发区域库,可以创建一个库( Area.a ,则, Area.so ,则, Area.dll Area.lib ,具体取决于平台和链接样式选择),并随 Area.h


    一般规则是任何源文件 %.cpp 已编译到目标文件 %.o

    请注意,您已经非常清楚 地区h类 地区cpp公司 输入 文件时间戳将显示您列出的哪些文件是由编译器创建的,并且您有一个Makefile,它可以指定 确切地 哪个文件是从哪个源生成的,或者描述与输入和输出文件名相关的模式。。。