【问题标题】:How do libraries with classes work?带有类的库如何工作?
【发布时间】:2013-02-12 19:48:50
【问题描述】:

在学校学习 C++ 时,我们从未真正谈论过如何构建库,对于我的初步理解,我深表歉意。 从我在网上阅读的内容来看,库似乎只是已经编译的代码集合,然后有一个.h 文件列出了该库中可以访问的函数。

例如,当我 #include <cmath> 时,我现在可以调用 sin(x) 而无需访问 cmath 代码来编译它。我的问题是这是否适用于其中包含数据的类。

那么我可以创建一个库

//AccumulatorLibrary.h
class Accumulator
{
public:
    int num;
    int increment() {num++};
    void otherFunctions(); //otherFunctions defined in the .lib file
}

然后调用它

//Main
#include "AccumulatorLibrary.h"
#include <stdio>
int main()
{
    Accumulator A(0); //initalize num to 0
    Accumulator B(7); //initalize num to 7
    cout<<A.increment;
    cout<<B.increment;
    cout<<A.increment;
}

并获得1 8 2 的输出?

总之,如果我弄清楚如何将一堆类放入库文件中,我是否可以访问任何我想要的数据,只要该数据在 .h 文件中具有访问功能?

或者一个更基本的问题,做一个.h.lib 文件的工作方式与常规c++代码完全相同,只是在使用时不必编译,并且您无权访问.lib 文件中的代码?

【问题讨论】:

  • 简而言之,是的。库文件基本上是目标文件的集合,并且在“正常”构建程序时链接目标文件。库的工作方式完全相同。
  • 你的代码有很多错误,最好用编译器来验证我们的想法……
  • 是的,对不起。我意识到代码不会运行,我只是想输入足够多的内容以希望能解决问题。

标签: c++ libraries


【解决方案1】:

从我在线阅读的内容来看,库似乎只是已经编译的代码集合,然后有一个 .h 文件列出了该库中可以访问的函数。

正确。

我的问题是这是否适用于其中包含数据的类。

确实如此。许多 C++ 库都公开了类,并在库中预编译了它们的代码。

或者一个更基本的问题,.h 和 .lib 文件的工作方式是否与常规 c++ 代码完全相同,只是在使用时不必编译...

等等,等等。 .h 文件仍然包含 C++ 代码(声明,有时甚至是内联实现)。 .lib 文件是动态链接的库。它们是 C++ 源文件编译(和链接)的结果。

...而您无权访问 .lib 文件中的代码?

您确实可以访问它:使用反汇编程序打开它。它不再是 C++。

【讨论】:

  • @MooingDuck 好吧,熟练的逆向工程师会这样做(我同意,同时我不是熟练的逆向工程师)。问问你当地的渗透测试小组的厨师,看看他的反应;-)
  • 但这不是“代码”,而是“做同样事情的不同代码”
  • @MooingDuck 这是一些代码,无论如何......我们不要对此进行辩论:)
【解决方案2】:

根据我在网上阅读的内容,图书馆似乎只是一个 已经编译的代码集合

是和不是。

对我来说,“库”是一段代码(一个或多个标头(.h) 文件和零个、一个或多个源(.cpp)文件),没有 main() 函数,可以独立编译和链接(main() 除外)。

一个库可以通过多种机制获得:

  • 可作为源:在这里您必须将库与您的应用程序一起编译。示例包括 C++ 标准模板库、Boost C++ 库、您或您的同事编写的库、您从 sourceforge 下载的库等。(警告:有时基于源的库可以在系统中预编译作为编译优化。 )

    请注意,作为源可用意味着您可以阅读它,但不一定要修改它。

  • 以二进制形式提供:这里,库已经编译并且可能在您的系统中可用。例子有C标准库、C++标准库、C数学库等。从问题来看,听起来你指的是这个。

然后有一个 .h 文件列出了哪些函数可以访问 那个图书馆。

没错,C 库就是这种情况。对于 C++,这个概念自然地扩展到包括类和(公共)成员函数。

总而言之,如果我弄清楚如何将一堆类放入一个 库文件我可以访问任何我想要的数据,只要该数据有 .h 文件中的访问函数?

是的!

或者一个更基本的问题,.h 和 .lib 文件的工作方式完全相同 与常规 c++ 代码一样,只是它不必在何时编译 您使用它,但您无权访问 .lib 文件中的代码?

库遵循与 C++ 相同的规则,与上面提到的唯一区别是它没有 main() 函数。

您是否需要编译取决于您可以使用它的方式(见上文)。

对于许多库,您可以访问源代码(见上文)。

以下是您的示例的完整代码:

// AccumulatorLibrary.h
class Accumulator {
  public:
    Accumulator( int x ) : num( x ) {}    // ctor with initializer
    int increment() {num++};
    int get() const;
    void set( int x );
  private:
    int num;
};
// AccumulatorLibrary.cpp
int Accumulator::get() const { return num; }
int Accumulator::set( int x ) { num = x; }

// Usercode.cpp
#include "AccumulatorLibrary.h"
#include <iostream>
using namespace std;
int main() {
    Accumulator A(0); //initalize num to 0
    Accumulator B(7); //initalize num to 7

    A.increment();
    cout << A.get() << endl;        // print 1

    B.increment();
    cout << B.get() << endl;        // print 8

    A.increment();
    cout << A.get() << endl;        // print 2
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多