OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

UNIXのC++で共通クラスを作ってみんなで使いたい。

  • すぐに回答を!
  • 質問No.142189
  • 閲覧数129
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 87% (34/39)

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();
などと使えるのでしょうか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

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

やってみれば、すぐ分かることなのに。というのも、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


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

# 細かい記述ミスなんかは訂正をしています
お礼コメント
orange_pie

お礼率 87% (34/39)

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

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

その他の回答 (全1件)

  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

> 知りたい事の全てが、これらの言葉ですんなり理解できました。 解答をした甲斐があった、というもんです :-) 蛇足かもしれませんが、先の回答は、あくまでも、最初の取っ掛かり部分でしかないということを 言っておきます。 共通のクラスが増えてゆくことで、 ・あるクラスが別のクラスと関連を持っている ・Cインターフェースの関数 ・インライン関数 ・テンプレートクラス ...続きを読む
> 知りたい事の全てが、これらの言葉ですんなり理解できました。

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

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

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

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

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

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


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

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

#ifndef AAA_DEFINED
#define AAA_DEFINED

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

#endif /* AAA_DEFINED */

/usr/include 配下のヘッダファイルなんかを見てみると、だいたいこんな感じ
になっているのが分かると思います。
お礼コメント
orange_pie

お礼率 87% (34/39)

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

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

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


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

ありがとうございました。
投稿日時 - 2001-09-27 15:41:39


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ