Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在共享类时隐藏成员函数文件_C++_C++11_C++14 - Fatal编程技术网

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

C++ 如何在共享类时隐藏成员函数文件,c++,c++11,c++14,C++,C++11,C++14,我正在读保罗·德特尔写的《如何编程》一书。按照他的说法,我们可以制作一个不包含成员函数细节的文件 “为了隐藏类的成员函数实现细节,类实现程序员将向客户端代码程序员提供标题Time.h(指定类的接口和数据成员)和时间目标代码(即表示时间成员函数的机器代码指令)。客户端代码程序员没有获得Time.cpp,因此客户端仍然不知道Time的成员函数是如何实现的。” 我在dev中开发了下面的简单代码来测试这个概念,但我不知道编译后哪个文件与cpp文件等效 区域类别: #include<iostream

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

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

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

区域类别:

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