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();
などと使えるのでしょうか?
No.1ベストアンサー
- 回答日時:
> 私が何とか予想できる手順を以下に書きます。
やってみれば、すぐ分かることなのに。というのも、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
ね、質問に書いてあるままでしょう?
# 細かい記述ミスなんかは訂正をしています
すてき、すてき!!(^○^)
分かりやすくて素敵!!
ありがとうございます。早速やってみます。
<他のプログラム(コンパイル単位)で必要なのは、クラスの宣言です。>とか
<ヘッダファイル aaa.h に記述します。>とか
<クラスのメソッドの定義は、aaa.cpp に記述します。 >とか、
<使う側では、ヘッダファイルをインクルードするだけで、コンパイルが通ります。 >とか、
知りたい事の全てが、これらの言葉ですんなり理解できました。
「痒いところに手が届いちゃった」という感じです。
こんな長ったらしくて要点がまとめられない質問から
知りたい事を分かってもらえたのがとっても嬉しいです。
ありがとうございます。
No.2
- 回答日時:
> 知りたい事の全てが、これらの言葉ですんなり理解できました。
解答をした甲斐があった、というもんです :-)
蛇足かもしれませんが、先の回答は、あくまでも、最初の取っ掛かり部分でしかないということを
言っておきます。
共通のクラスが増えてゆくことで、
・あるクラスが別のクラスと関連を持っている
・Cインターフェースの関数
・インライン関数
・テンプレートクラス
なんてことがでてくるので。
まあ、そのときには、また質問をしてみればいいんですけどね。
とりあえず、さっきの回答をひとつだけ補足しておきます。
インクルードファイルの二重読み込みの防止だけはしておいた方が良いでしょう。
インクルードファイルの内容を以下のような感じのマクロで括っておきます。
#ifndef AAA_DEFINED
#define AAA_DEFINED
class AAA {
public:
void init();
void clean();
private:
int elems;
};
#endif /* AAA_DEFINED */
/usr/include 配下のヘッダファイルなんかを見てみると、だいたいこんな感じ
になっているのが分かると思います。
そうですね。
>共通のクラスが増えてゆくことで、
>・あるクラスが別のクラスと関連を持っている
>・Cインターフェースの関数
>・インライン関数
>・テンプレートクラス
>なんてことがでてくるので。
ム(-"-;)むむむ。。。。
>まあ、そのときには、また質問をしてみればいいんですけどね。
そうします。今は難しいことは後回しにして、基本的な使い方だけ
会得することにします。
>インクルードファイルの二重読み込みの防止だけはしておいた方が良いでしょう。
そうですね。いつもはやっていますが、今はまだヘッダーファイルを配布した時の事まで考えていませんでした。そうします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java final 1 2022/06/10 22:49
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
関数内の変数に<summary>コメン...
-
C# log4netの使い方
-
import と extends について
-
親クラスから子クラスへアクセス。
-
visual studioのデザイナ画面で...
-
C#にて別クラスの関数を使いたい
-
ClassLoader.getSystemResource...
-
java-別クラスの変数の使い方を...
-
範囲外の数値を代入したらエラ...
-
無名パッケージからのインポート
-
Java
-
JTableのイベント取得方法
-
C#でほかのファイルにある自作...
-
構造 他のクラスの構造体を別...
-
C++でfriendクラスにしているの...
-
javaでメインクラスが見つから...
-
外部からメンバ変数の中身を取...
-
アップキャスト、ダウンキャス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
親クラスから子クラスへアクセス。
-
C#でほかのファイルにある自作...
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
範囲外の数値を代入したらエラ...
-
ひとつのファイルにクラスは1つ?
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
java-別クラスの変数の使い方を...
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
C# log4netの使い方
-
a href="..." とServlet
-
アップキャスト、ダウンキャス...
-
オブジェクトのデータをもとにX...
おすすめ情報