アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++での静的ライブラリの作成方法

今まで独学でC++を勉強してきたのですが、既存ライブラリのラッパーを作りたいと思います
そこで、色々なサイトなどで調べてみたのですが、いまいちライブラリというものについて納得の出来る解説のあるサイトが見つからなかったので、質問させて下さい

まず私が元にするライブラリの構成は
hoge.h
foo.lib
bar.lib
となっており、その関数などを使用する独自型のクラスや、それをさらに扱うクラスなどを作っています
その場合、ふたつのクラスをひとつのlibファイルに一緒にしてもいいものなのか、
はたまた分けてそれぞれlibファイルにするのか、
複数できたヘッダはプロジェクトに追加するときどれを入れるのか、
インクルードやリンクはどこに張ればいいのか、
libファイルにヘッダは含まれているのか、など
基本的なことが全然わからず、身近に聞ける人もいなくずっと手探り状態です
よろしければ全体のファイル構成や作り方、使い方などの基本的なことから教えて下さい


あと別件なのですが、クラスのインスタンスが生成されたときにメンバ変数はメモリに動的に配置されると思うのですが、メンバ関数はどうなるのでしょうか?
インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか?

よろしくお願いします!

A 回答 (4件)

回答#2の者です。



回答に誤りがあったので、修正します。

コンパイラの実装依存の面はあるのですが、非virtual関数の場合は、クラスオブジェクト内に関数ポインタは確保されません。newされたときに取られるのは、メンバ変数の分の領域だけです。
今、gccで試したところ、このような実装でした。クラス名とメンバ関数名で、静的に関数の位置を解決しているのですね。

回答者#3さんの例題が正しいと思います。

また、例によって、virtual関数の場合は、話は別です。オブジェクト内にポインタが用意されます。

以上、失礼いたしました。
    • good
    • 0
この回答へのお礼

ご連絡が遅れて申し訳ありません
当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした

わざわざ試していただいたということで、どうもありがとうございます!
ありがとうございました!

お礼日時:2010/11/11 14:46

コンパイル環境などを提示しないと答えられないと思います。


通常ライブラリは、リンカーのオプションに指定すると思います。
VCなどの統合環境ですと意識しませんが、プリプロセッサ、コンパイル、リンクなど、ビルドの過程を理解したほうがいいかと思います。

メンバ関数ですが、言語はC++ですね。
メンバ関数は静的に割り当てられます。通常のCの関数となんら変わりません。
インスタンスの数だけメンバ変数は個々のメモリエリアに確保されますが、メンバ関数は1つだけです。

class におけるメンバ関数を、struct で実現すると以下のようになります。
この2つが等価であることが分かるでしょうか。

class TestA {
int a;
public:
int func( int b ) { return this->a * b; }
};

struct TestB{
int a;
};
int TestB_func( Test* this, int b ) { return this->a * b; }

main()
{
int c;
TestA a;
c = a.func( 10 );

TestB b;
c = TestB_func( &b, 10 );


※理解が深まってきたら、仮想関数(virtual)についても勉強しましょう。
    • good
    • 0
この回答へのお礼

ご連絡が遅れて申し訳ありません
当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした

例を示して解説していただいたのでとてもわかりやすかったです!
ありがとうございました!!

お礼日時:2010/11/11 14:47

質問の後半について。



メンバ変数の実体が生成されるのは、プログラム(EXEファイル、DLLファイル)のロード時です。これは、クラスメンバではない、普通のC言語関数も同じ。厳密にいうと、生成ではなく、portable executable形式のファイルが、プロセスのアドレス空間にメモリマップされるだけです。

それに加え、C++のクラスがnewされると、確保したメモリ領域の中にメンバ関数へのポインタが書き込まれます。この仕事を行うのが「コンストラクタ」です。この「コンストラクタ」は、コンパイラがビルド時にこっそりと、実行ファイルへ自動的に加えています。

つまり、C++でnewされたメモリ領域は、
・メンバ関数へのポインタ。
・メンバ変数。
で構成されているわけです。

ここまでは、
メンバ変数が非virtualの場合の説明。

virtualの場合は、話が長くなるので、省略します。
キーワードは "v-ptr"(virtual pointer)、"v-table"。
マイクロソフトのCOMオブジェクトなどにも繋がる、なかなか良い話です。


コンピュータ言語というのは、「記述」という面でだけではなく、実行時にどう動くのか、という点も大切なのです。
    • good
    • 0

前半の質問はちょっと意味が分かりませんでした。



私なりの解釈では、
-「hoge.h/foo.lib/bar.lib」という構成のライブラリが存在する
-それを使ってラッパーライブラリを作りたい
-作ったライブラリは「○○○.h/○○○.lib」という形にして他者に配布したい

といった感じですか?
最終的に何をしたいのかを明確にしてくれればアドバイスしやすくなると思います。


>インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか?

メンバ関数のコードはメモリー上にすでに生成されていて、クラスインスタンスには各関数へのポインタだけが用意されています。

この回答への補足

返信ありがとうございます
質問が不備ですみません

おおよそBearCaveさんの解釈で合っているかと思います
あと、以前複数のlibファイルをひとつにまとめることは出来ない、というようなことを聞いたので、
元のライブラリの3ファイル+自前のヘッダ1つ&自前のlibファイル1つをプロジェクトに加える、と考えているのですがどうでしょうか?
なお、プロジェクト側には既存のライブラリ自体の機能は持たせず、あくまでラッパーを介して処理をさせるつもりです

メンバ関数に関しては了解です
ありがとうございました

補足日時:2010/10/28 17:01
    • good
    • 0
この回答へのお礼

ご連絡が遅れて申し訳ありません
当方のPCが落雷の影響を受けてごたごたしており、連絡が出来ない状況でした

本当はこちらに書くべきだったのかな?
初めてなのでわからなかったです・・・
ありがとうございました!!

お礼日時:2010/11/11 14:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!