图书馆中的类是如何工作的?

4
在学校学习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文件中的代码?


2
简而言之,没错。库文件基本上是对象文件的集合,在“正常”构建程序时链接对象文件。库的工作方式完全相同。 - Frédéric Hamidi
1
你的代码中有很多错误,最好使用编译器来验证我们的想法。 - CapelliC
是的,抱歉。我意识到那段代码无法运行,我只是想打足够的字来希望能够清楚地表达问题。 - user1860611
2个回答

6
根据我在网上阅读的内容,似乎库只是一组已编译的代码,并且存在一个 .h 文件列出了该库中可访问的函数。
正确。
我的问题是,这是否适用于其中包含数据的类。
是的。许多 C++ 库公开了类并将其代码预编译到库中。
或者更基本的问题是,.h 和 .lib 文件是否与常规的 C++ 代码完全相同,只不过在使用时无需编译...
等等,.h 文件仍然包含 C++ 代码(声明甚至有时包括内联实现)。 .lib 文件是动态链接库。它们是 C++ 源文件的编译(和链接)结果。
...而且您无法访问 .lib 文件中的代码吗?
您可以访问它:使用反汇编器打开它。只是它不再是 C++ 了。

1
@MooingDuck 嗯,熟练的逆向工程师会(我同意,但我不是一位熟练的逆向工程师)。问问你当地渗透测试小组的厨师,看看他会如何回答;-) - user529758
但那不是“代码”,那是“做同样事情的不同代码”。 - Mooing Duck
@MooingDuck 那是一些代码,不管怎样...我们不要就此展开辩论 :) - user529758

1
根据我在网上读到的,似乎库只是已编译代码的集合。 是和不是。
对我来说,“库”是一组代码(一个或多个头文件(.h)和零、一个或多个源文件(.cpp)),没有main()函数,可以独立编译和链接(除了main())。
库可能以各种机制提供:
- 作为源代码提供:在这里,您必须将库与您的应用程序一起编译。例如,C++标准模板库、Boost C++库、您或同事编写的库、您从sourceforge下载的库等。(注意:可作为编译优化在系统中预编译基于源代码的库。) - 作为二进制文件提供:在这里,库已经编译好,也许已经在您的系统中可用。例如,C标准库、C++标准库、C数学库等。从问题中听起来,这是您所指的。
然后有一个.h文件,列出了该库中可访问的函数。对于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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接