4

学校でC++を学ぶとき、ライブラリの構築方法について実際に話したことはありませんでした。そのため、基本的な理解をお詫びします。私がオンラインで読んだことから、ライブラリはすでにコンパイルされたコードの単なるコレクションであり.h、そのライブラリでアクセス可能な関数をリストしたファイルがあるようです。

たとえば、コンパイルするためにcmathコードにアクセスせずに#include <cmath>呼び出すことができる場合です。sin(x)私の質問は、これがデータを含むクラスで機能するかどうかです。

だから私はライブラリを作成できますか

//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ファイル内のコードにアクセスできない点が異なりますか?

4

2 に答える 2

5

私がオンラインで読んだことから、ライブラリはすでにコンパイルされたコードの単なるコレクションであり、そのライブラリでアクセス可能な関数をリストした.hファイルがあるようです。

正しい。

私の質問は、これがデータを含むクラスで機能するかどうかです。

します。多くのC++ライブラリはクラスを公開し、それらのコードをライブラリにプリコンパイルしています。

または、より基本的な質問ですが、.hおよび.libファイルは、使用時にコンパイルする必要がないことを除いて、通常のc++コードとまったく同じように機能します...

待って待って。.hファイルにはまだC++コード(宣言、場合によってはインライン実装)が含まれています。.libファイルはダイナミックリンクライブラリです。これらは、C ++ソースファイルのコンパイル(およびリンケージ)の結果です。

...そして.libファイルのコードにアクセスできませんか?

アクセスできます。逆アセンブラを使用して開きます。もはやC++ではありません。

于 2013-02-12T19:54:49.183 に答える
1

私がオンラインで読んだことから、ライブラリはすでにコンパイルされたコードの単なるコレクションのようです

はいといいえ。

私にとって、「ライブラリ」とは、関数のないコードの本体(1つ以上のヘッダー(.h)ファイルと0、1つ、または複数のソース(.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
}
于 2013-02-12T20:29:37.730 に答える