共享类时如何隐藏成员功能文件

How to hide member function file while sharing class

本文关键字:隐藏 成员 功能 文件 何隐藏 共享      更新时间:2023-10-16

我正在阅读保罗·迪特尔(Paul Deitel(的《如何编程》。根据他,我们可以制作一个不包含成员功能详细信息的文件。

"隐藏班级的成员函数实现详细信息,类象征程序员将为客户端代码程序员提供标题时间。代表时间成员函数的机器代码指令(。客户端编码器没有给出时间。

我已经在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创建的文件是:abore.cpp,abreat.o,abreat.h,main.cpp,main.o,makefile.win,balout and exe。

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

C 应用程序的标准结构看到转换单元(.CPP文件(的功能分开。这些文件保留了功能的定义。为了使这些功能从其他翻译单元中使用,这些单元需要可见函数声明。因为我们不想 include我们需要的每个.cpp文件的整个文件,所以我们通常将声明分离为标头文件(.h或.hpp(。例如:

circle.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();
}

circle.cpp

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

main.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()的引用。由于该函数的签名可通过随附的.h文件获得,因此编译器知道如何调用它,而不是如何找到它。链接器将获取所有对象文件,并将它们链接到一个可执行文件中,例如myproject.exe。

因此,在标准的C 应用程序中,没有"等同于CPP文件"。中间.o不打算共享并包含在其他项目中,而myproject.exe只是可执行的。

您实际需要做的是构建库。这是一种可执行的形式,不是独立应用程序。然后,链接器的最终输出将为.dll,.lib,.so或.a(取决于平台和链接方法(,它将以可执行文件(不是源(表单保存您的所有函数实现。然后,您可以将库与.h文件一起分发,并让人们链接到它。

再次,没有"等效的CPP"文件。构建的库将包含您指定为输入的所有翻译单元,因为构建过程与上述非常相似。不同之处在于,输出将不是可执行的应用程序,而是一个库,可以根据需要从此链接此库的另一个应用程序中调用功能。

没有建造库的统一方法。当您使用IDE时,创建新项目时可能是一个选择。

我不知道编译了哪种文件等效于CPP文件。

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

实现源代码是 Area.cpp,并且将其编译到文件Area.o中的实现对象代码。

如果要分发您的区域库,则将创建一个库(Area.aArea.soArea.dllArea.lib,取决于平台和链接式选择(,并与Area.h一起分发。


一般规则是任何源文件 %.cpp均编译到对象文件%.o

注意,您已经非常清楚地知道,Area.hArea.cpp是编译器的输入(因为您自己写了它们(,并且文件时间戳将显示您列出的文件中的哪个文件是由编译器创建的,您有一个makefile,它可以指定恰好 是从哪个源构建的,或描述了与输入和输出文件相关的模式...