プロが教える店舗&オフィスのセキュリティ対策術

Linux上で稼動するあるC++のプログラムを作るのに、
みんなで使えるような、共通クラスを作りたいと思っています。
クラス自体の作り方(プログラムコード)はだいたい分かるのですが、
それをどのような形(lib?またはアーカイブ?またはdll?)で
配布すると、みんなが使いやすいものになるのかが分かりません。
手順など、どなたか教えてください。
私が何とか予想できる手順を以下に書きます。

(1)普通にクラスを作成する。(例えばaaa.cppと言う名前のファイルに)
  public class AAA{
public:
void init();
void clean();
private:
int elems;
}
void AAA::init(){
elems = 0;
}
void AAA::clean(){
elems = 0;
}
※この時点でクラスの定義部分だけをヘッダーファイルとして
  別ファイルにしておいた方が良いのでしょうか?

(2)このクラスをコンパイルして、みんなに提供できる何らかの形にする。
 ※ここがよく分かりません!!
 ※”.a”というアーカイブを作成する方法は知っています。
  これを作れば良いのでしょうか?

(3)出来上がった共通クラスをどうにかして、他の人のプログラムで使えるようにする。
 ※予想としては、(1)で作ったクラス定義のヘッダーファイルを
  includeする(のかな?)
  それから、コンパイルする時にmakefileの中で(2)で作った
  ライブラリ(?)を一緒にリンクする(のかな?)
 ※プログラム中では、いきなり
   AAA testBuf = new AAA();
testBuf.init();
などと使えるのでしょうか?

A 回答 (2件)

> 私が何とか予想できる手順を以下に書きます。



やってみれば、すぐ分かることなのに。というのも、orange_pie さんが考えて
いる通りで、実現できるから、です。

他のプログラム(コンパイル単位)で必要なのは、クラスの宣言です。なので、

class AAA{
public:
void init();
void clean();
private:
int elems;
};

は、ヘッダファイル aaa.h に記述します。クラスのメソッドの定義は、aaa.cpp に
記述します。

#include "aaa.h"

void AAA::init()
{
elems = 0;
}
void AAA::clean()
{
elems = 0;
}

で、その定義をコンパイルしてアーカイブに入れておきます。(知っているようですが)例えば、

% gcc -c aaa.cpp
% ar -r libaaa.a aaa.o

使う側では、ヘッダファイルをインクルードするだけで、コンパイルが通ります。

#include "aaa.h"

int main()
{
AAA *testBuf = new AAA();
testBuf->init();
return 0;
}

リンクする際には、先程作成したアーカイブが必要になります。

% gcc -o test_aaa test_aaa.cpp -laaa


ね、質問に書いてあるままでしょう?

# 細かい記述ミスなんかは訂正をしています
    • good
    • 0
この回答へのお礼

すてき、すてき!!(^○^)
分かりやすくて素敵!!
ありがとうございます。早速やってみます。
<他のプログラム(コンパイル単位)で必要なのは、クラスの宣言です。>とか
<ヘッダファイル aaa.h に記述します。>とか
<クラスのメソッドの定義は、aaa.cpp に記述します。 >とか、
<使う側では、ヘッダファイルをインクルードするだけで、コンパイルが通ります。 >とか、

知りたい事の全てが、これらの言葉ですんなり理解できました。
「痒いところに手が届いちゃった」という感じです。
こんな長ったらしくて要点がまとめられない質問から
知りたい事を分かってもらえたのがとっても嬉しいです。
ありがとうございます。

お礼日時:2001/09/27 15:13

> 知りたい事の全てが、これらの言葉ですんなり理解できました。



解答をした甲斐があった、というもんです :-)

蛇足かもしれませんが、先の回答は、あくまでも、最初の取っ掛かり部分でしかないということを
言っておきます。

共通のクラスが増えてゆくことで、

・あるクラスが別のクラスと関連を持っている
・Cインターフェースの関数
・インライン関数
・テンプレートクラス

なんてことがでてくるので。

まあ、そのときには、また質問をしてみればいいんですけどね。


とりあえず、さっきの回答をひとつだけ補足しておきます。

インクルードファイルの二重読み込みの防止だけはしておいた方が良いでしょう。
インクルードファイルの内容を以下のような感じのマクロで括っておきます。

#ifndef AAA_DEFINED
#define AAA_DEFINED

class AAA {
public:
void init();
void clean();
private:
int elems;
};

#endif /* AAA_DEFINED */

/usr/include 配下のヘッダファイルなんかを見てみると、だいたいこんな感じ
になっているのが分かると思います。
    • good
    • 0
この回答へのお礼

そうですね。
>共通のクラスが増えてゆくことで、
>・あるクラスが別のクラスと関連を持っている
>・Cインターフェースの関数
>・インライン関数
>・テンプレートクラス
>なんてことがでてくるので。

ム(-"-;)むむむ。。。。

>まあ、そのときには、また質問をしてみればいいんですけどね。
そうします。今は難しいことは後回しにして、基本的な使い方だけ
会得することにします。


>インクルードファイルの二重読み込みの防止だけはしておいた方が良いでしょう。
そうですね。いつもはやっていますが、今はまだヘッダーファイルを配布した時の事まで考えていませんでした。そうします。

ありがとうございました。

お礼日時:2001/09/27 15:41

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