• ベストアンサー

C++書式について

お世話になります C++の書式について教えてください クラスは*.hファイルに宣言すると思います クラスのメンバー関数は、*.cファイル?、*.hファイルに書くのでしょうか? それとも、*.c、*.hに分ける意図があるのでしょうか? 例えば、public関数は*.cに書くとか・・・ あと、このような一般的な書式について書かれている、何か良い本がありましたら、教えてください よろしくお願い致します

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

まず、C++のソースファイルで *.c を使うことは稀です。 よくあるのは、 *.cpp *.cc *.C などです。 ヘッダファイルは *.h のこともありますが、 *.hpp *.hh なども使われます。添え字(拡張子)なしのこともあります。 次に、どのファイルに何を書くかですが、これは一般的な作法というより、目的で使い分けるべきです。 例えば、インライン関数やテンプレートの場合はヘッダファイルに記述するしかありません(exportがサポートされているならこの限りではありませんが)。型定義やマクロも然りです。const定数は、汎整数型のものはヘッダファイルで定義するとよいでしょう。 それ以外はヘッダファイルに記述することはできません。また、単一の翻訳単位でしか使用しないものは、ヘッダファイルで定義する必要はないでしょう。

関連するQ&A

  • ソースファイルの分割について

    a.h クラスの定義 a.cpp クラスのメンバ関数の定義 b.h #include "a.h" クラスの定義 b.cpp クラスのメンバ関数の定義 ----c.cpp---- #include "a.h" #include "b.h" a.hで定義したクラスの宣言 b.hで定義したクラスの宣言 メインの処理 ----------------------------------------- b.cppで定義しているクラスのメンバ関数にて a.cppで定義したクラスのメンバ変数にアクセスしたいのです。 どうするのが一番良いのでしょうか? a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを extern宣言してみたのですがエラーが出てコンパイルが通らないです。

  • クラスのメンバ関数を別ファイルで定義したときのバグ

    C++ においてヘッダファイルで宣言したクラスのメンバ関数を別のソースファイルで定義して、コンパイルするとうまくいきません。エラーは出ないのですが、同名の何もしない関数としてコンパイルされているようなのです。クラスのメンバ関数を宣言したのと同じヘッダに書くとちゃんとコンパイルされます。 どうしてそうなるのか、いまいち原因がわかりません。

  • 複数クラスで共通の関数、変数の呼び出し方

    お世話になります。 質問させて頂きたいことは 複数のクラスで共通して使われる関数、変数があった場合、その関数、変数は私の中で次の2通りの方法が思い当たったのですがどちらのほうがメモリ等の使用からよいのでしょうか? 1つめは あるヘッダファイル****.hを作成し、その中で関数を宣言し、変数はそのヘッダファイルのソースファイル中のグローバル変数とする。 2つめは クラスを作成し、静的メンバ関数、静的メンバ変数とする。 ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、静的メンバを今まで使ったことがないので、このような用途に使われるべきなのかも正直わかっていません。 検討外れのことを言っているのかもしれませんが、教えて頂ければと思っております。宜しくお願い致します。

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

    C++での静的ライブラリの作成方法 今まで独学でC++を勉強してきたのですが、既存ライブラリのラッパーを作りたいと思います そこで、色々なサイトなどで調べてみたのですが、いまいちライブラリというものについて納得の出来る解説のあるサイトが見つからなかったので、質問させて下さい まず私が元にするライブラリの構成は hoge.h foo.lib bar.lib となっており、その関数などを使用する独自型のクラスや、それをさらに扱うクラスなどを作っています その場合、ふたつのクラスをひとつのlibファイルに一緒にしてもいいものなのか、 はたまた分けてそれぞれlibファイルにするのか、 複数できたヘッダはプロジェクトに追加するときどれを入れるのか、 インクルードやリンクはどこに張ればいいのか、 libファイルにヘッダは含まれているのか、など 基本的なことが全然わからず、身近に聞ける人もいなくずっと手探り状態です よろしければ全体のファイル構成や作り方、使い方などの基本的なことから教えて下さい あと別件なのですが、クラスのインスタンスが生成されたときにメンバ変数はメモリに動的に配置されると思うのですが、メンバ関数はどうなるのでしょうか? インスタンスごとに同じく生成されるのか、宣言の時に既に一箇所に用意されていて、毎回そこに飛ぶのでしょうか? よろしくお願いします!

  • クラスのスコープ範囲

    再度お世話になります。 C++のクラスについての質問ですが、 別ファイル(別のDLL)に定義されているメンバ関数を利用したいのですが、 どのように外部宣言すればよろしいのでしょうか。 どうぞ宜しくお願いします。 例) A.dll あるクラス内に格納されている値を取得する為に、 Get_XXXというメンバ関数が定義されている。 B.dll こちらからその値をそのメンバ関数を利用して取得する。

  • ヘッダーファイルでは、他のヘッダーファイルをインクルードできないのか

    Javaを仕事で使っています。 最近趣味でC++を始めました。色々形式の違いに戸惑っています。 C++では関数を宣言しなければならないので、クラス名と同じヘッダーファイルにそのクラスで使う関数を宣言して、それをインクルードしています。 そこで今、壁にぶちあたりました。 あるクラス(仮にFooとします)の関数で、他のクラス型(Hogeとします)を引数に取りたいので、ヘッダーファイルにそれを宣言しようとしているのですが、コンパイルエラーになってしまいます。 Foo.hは以下のような感じ。 #include Hoge.h 中略 GetHoge(Hoge hoge); コンパイルエラーでは error C2011: 'Hoge' : 'class' 型の再定義 などと言われます。 クラスとその同名のヘッダーファイル、という形式を変えずに 他のクラス型を引数にとる関数を作るには、どうしたらよいのでしょうか? C++に関しては全くの素人です。詳しい方、ご教示願います。

  • C言語で分割ファイル先の関数を呼び出す時

    いつもお世話になっております. C言語の関数の呼び出しについて質問があります. main文と同じファイルにある関数は,main文より上に記述している場合は プロトタイプ宣言で呼び出すことが出来ますが,ファイルを関数ごとに分割した場合はどうしたら良いのでしょうか? 例えば main_file.c と function_file.c という2つのファイルがあり, それぞれ main と function という関数を持っているとします. main文からfunction関数を呼び出したい場合, 私はいつも main_file.c 内で include "function_file.c" としていますが, これが一般的な方法なのでしょうか? 問題点や改善点を挙げて頂けると助かります. よろしくお願い致します.

  • ヘッダファイルに関数本体を書き込めないのか?

    こんにちは。 現在WindowsVistaでCおよびC++を使ってプログラミングを行っています。 最近になって思ったのですが、普通、ヘッダファイルに記述する内容は、 ・関数のプロトタイプ ・クラスのメンバ関数を除いた部分(いわゆる「クラスの骨格」) ・マクロ といったものだと言われています。 そして、関数の実態やクラスのメンバ関数などは、 別のソースファイルに記述するように言われています。 なぜ、ヘッダファイルに関数の実態や、クラスのメンバ関数を記述するべきではないでしょうか? あるいは、プログラムの内容に応じて、関数やクラスの内容を、 ヘッダファイルにまるごと記述してもよい場合と悪い場合があるのでしょうか? こういった事について、何か御存じの方がいらっしゃれば、是非アドバイスをお願い致します。 (難しい問題なので、なるべく詳しい説明を頂けると、大変助かります。) ちなみに、関数やクラスのメンバ関数も一緒に、クラスの内容をまるごとヘッダファイルに記述しても、 今までの所、全く問題なく動作しています。 例えば、以下のようなプログラムは、何の問題もなく動作します。 ●main.c ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "func.h" void main(void) { char str[80]; puts("文字列を入力せよ"); gets(str); func(str); } ____________________________________________________________ ●func.h ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void func(char *p) { puts("入力された内容は以下の通り。"); while(*p) putchar(*p++); } ____________________________________________________________

  • ソースファイルの分割

    自分で作成したプログラムが長くなってしまったのでいくつかのファイルに分割したいのですが、一般にはどのように分けるのでしょうか? 作成したプログラムは以下のような内容を含んでいます。 クラス  クラスの定義  メンバ関数の定義 関数×2  定義  プロトタイプ宣言 main関数 プリプロセッサ制御文も教えてくださると助かります。

  • C言語の質問

    Fortran言語にはsign(x,y)の関数があります、つまりxの絶対値をもち、かつyの符号をもつ値を生成する関数です。 C言語にこのような関数をも使いたいのですが、調べてみるとcopysignという関数がありました、関数の機能説明もFortaranのsignと同じとなっています。しかしながら、実際にCのソースファイルにcopysignを使うと、ビルド時に、「error C3861: 'copysign': 識別子が見つかりませんでした」のエラーが出てきました。また宣言時に「#include <math.h>も入れています。  どちら様がご存知ならば教えていただければ幸いなことです。  宜しくお願い致します!<^ ^>!!!

専門家に質問してみよう