C++ 如何在共享类时隐藏成员函数文件
我正在读保罗·德特尔写的《如何编程》一书。按照他的说法,我们可以制作一个不包含成员函数细节的文件 “为了隐藏类的成员函数实现细节,类实现程序员将向客户端代码程序员提供标题Time.h(指定类的接口和数据成员)和时间目标代码(即表示时间成员函数的机器代码指令)。客户端代码程序员没有获得Time.cpp,因此客户端仍然不知道Time的成员函数是如何实现的。” 我在dev中开发了下面的简单代码来测试这个概念,但我不知道编译后哪个文件与cpp文件等效 区域类别:C++ 如何在共享类时隐藏成员函数文件,c++,c++11,c++14,C++,C++11,C++14,我正在读保罗·德特尔写的《如何编程》一书。按照他的说法,我们可以制作一个不包含成员函数细节的文件 “为了隐藏类的成员函数实现细节,类实现程序员将向客户端代码程序员提供标题Time.h(指定类的接口和数据成员)和时间目标代码(即表示时间成员函数的机器代码指令)。客户端代码程序员没有获得Time.cpp,因此客户端仍然不知道Time的成员函数是如何实现的。” 我在dev中开发了下面的简单代码来测试这个概念,但我不知道编译后哪个文件与cpp文件等效 区域类别: #include<iostream
#include<iostream>
using namespace std;
class Area {
public:
int square(int);
private:
int x;
};
#包括
使用名称空间std;
班级面积{
公众:
整数平方(整数);
私人:
int x;
};
源代码Area.cpp,其中包含成员函数功能
#include<iostream>
#ifndef AREA_HH
#define AREA_HH
# include "Area.h"
int Area::square(int x)
{
return x*x;
}
#endif
#包括
#ifndef区域
#定义区域
#包括“区域h”
整数面积::平方(整数x)
{
返回x*x;
}
#恩迪夫
主要内容:
#包括
#包括“区域h”
使用名称空间std;
int main()
{
区域Obj1;
库特
我不知道编译后哪一个文件相当于cpp文件
它是实现.h文件中声明的函数的文件。在您的例子中,它是“Area.cpp”。实现源代码是Area.cpp
,它被编译为文件Area.o
中的实现目标代码
如果要分发区域库,您需要创建一个库(Area.a
,Area.so
,Area.dll
或Area.lib
,具体取决于平台和链接样式选择),并将其与Area.h
一起分发
一般规则是任何源文件%.cpp
编译到目标文件%.o
注意,您已经非常清楚Area.h
和Area.cpp
是编译器的输入(因为它们是您自己编写的),文件时间戳将显示您列出的文件中哪些是由编译器创建的,并且您有一个Makefile,该Makefile可以精确指定哪个文件是从哪个源生成的,或者描述与输入和输出文件名相关的模式…您不能将类与可执行文件隔离。要共享这样的功能,您必须构建一个库而不是应用程序。要理解为什么在构建项目时找不到一个保存类的独立文件,您必须了解构建是如何工作的
< C++应用程序的标准结构可以看到跨翻译单元(.CPP文件)的功能拆分。。这些文件包含函数的定义。为了从其他翻译单元使用这些函数,这些单元需要可以看到函数声明。因为我们不希望包含所需的每个.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();
}
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
<> P>在一个标准的C++应用程序中,没有“等价于CPP文件”。中间的.O不打算被共享并包含在其他项目中,MyPrimeX.EXE只是一个可执行文件。
您实际上需要做的是构建一个库。这是一种可执行的形式,不是一个独立的应用程序。然后链接器的最终输出将是一个.dll、.lib、.so或.a(取决于平台和链接方法),它将把您的所有函数实现保存在可执行文件(而不是源文件)中然后您可以将该库与.h文件一起分发,并让人们链接到该库
同样,没有“cpp的等价物”文件。生成库将包含您指定为输入的所有转换单元,因为生成过程与上述过程非常类似。区别在于,输出将不是一个可执行应用程序,而是一个库,根据需要从另一个链接到此库的应用程序中调用函数
没有统一的方法来构建库。当您使用IDE时,它可能会成为创建新项目时的一个选项。Area.cpp
是包含实现的文件。但是使用hpp头无助于分发对象代码,这似乎是问题所要问的。@无用,是的,我知道这就是为什么我评论这个问题,并没有提供这个答案,因为我知道这不是问题的答案,而是对当前话题的评论。我认为这是有价值的信息,因为这是C++代码,OP显然正在寻找一个分类库。我要删除我的评论,因为我应该说如果它。“代码> C代码/代码>,使用<代码> .H/COD>,如果有代码> CPP < /代码>,请使用 Hpp,但这里是一个很好的资源。当然,没有问题,最好是代码< > HPP< /COD> <代码> .H</C++ > C++头,这可能是一个很好的建议。你应该避免使用<名称空间STD < /代码> <代码> -这是一个坏习惯。习惯于使用名称空间前缀(std
故意非常短),或者只导入您需要的名称
#include "Circle.h"
int main() {
Circle c;
c.radius = 5.0;
float area = c.area();
}