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

VC++2005の超超初心者です。
現在、VC++2005(Express Edition)でCLRでプロジェクトを
つくり、いろいろとコーディングしています。

今まで、参考書「作って覚えるVisual C++ 2005 Express Editon」
を利用して、半分泣きながらコーディングしていました。

その参考書では、コーディングを*****.cppでなく、
****.hのファイルにすべて書いているのですが、いいものでしょうか?
先輩が残していったVC++6.0のソースを見ると、cpp内に書いていますが
どちらがよろしいでしょうか?

また、他の参考書を見ると、変数名の先頭に「m」をつけていますが、
何か意味があるのでしょうか?
(変数名をつける時の作法ってありますか?)

せっかくなら、きれいなソースを書きたいと思うので、
詳しい方いましたら、ご教授頂きたく思います。

A 回答 (5件)

幾つかの.cppで同じものを定義する必要があるもの→.hに定義を書く


1つの.cppで1回しか定義しないもの→.cppに書く

・幾つかの.cppで同じものを定義する必要があるものの例
#defineの定義
関数のプロトタイプ宣言
typedefの定義
structの定義
classの定義
など。

・1つの.cppで1回しか定義しないものの例
グローバル変数の実体の宣言
関数の実体の宣言
クラス変数の実体の宣言
構造体変数の実体の宣言
など。

例えば、t1.cpp、t2.cpp、t3.cppの3つのソースで
#define INPUT_BUF_MAX 256
の定義が欲しい場合は
-------t1.cpp-------
#define INPUT_BUF_MAX 256

-------t2.cpp-------
#define INPUT_BUF_MAX 256

-------t3.cpp-------
#define INPUT_BUF_MAX 256
と書いてはいけません。書くなら

-------t.h-------
#define INPUT_BUF_MAX 256

-------t1.cpp-------
#include "t.h"

-------t2.cpp-------
#include "t.h"

-------t3.cpp-------
#include "t.h"

と書きます。

もし「256を512にしよう」と思ったら「t.hの256を512に直して、再構築」で済みます。

もし、最初の書き方で、t3.cppだけ直し忘れると
-------t1.cpp-------
#define INPUT_BUF_MAX 512

-------t2.cpp-------
#define INPUT_BUF_MAX 512

-------t3.cpp-------
#define INPUT_BUF_MAX 256
になっていると「t3.cppだけ数字が違ったままになっていて、バグが出る」でしょう。

このように「共通の定義や宣言は、.hに書く」のです。

この回答への補足

ご回答、ありがとうございます。

非常に分かりやすく書いていただきありがとうございます。
この方法で、現在コーディングさせていただいています。

補足日時:2009/04/13 04:13
    • good
    • 0

> VC++2005の超超初心者です。



超超初心者なら、まずは汚くてもよいので、とにかく動くものを作ることを目指しましょう。
それを何度か繰り返すうちに、汚いコードの問題点を体感できるはずです。

綺麗に書く練習をするのは、それからでも良いと思います。
そうでないと、他人の意見を鵜呑みにするしかなくなります。これでは、どんなコーディング規約も形骸化してしまいます。

この回答への補足

ご回答、ありがとうございます。

おっしゃるとおり、書いて動いてなんぼですよね。
しかしながら、後々自分以外の人が修正したり機能拡張したりする場合
を考慮したいと思ったため、このような質問をさせて頂きました。

とにかく、たくさんのソースを書いていこうと思います。

補足日時:2009/04/13 04:26
    • good
    • 0

VC2005/2008等でWindowsFormでアプリをデザイナを使ってプログラミングするなら


ヘッダーファイルの中に実装コードを書くほうが都合がいいかもしれません

一般的な C/C++の場合は
宣言、定義などをヘッダーに集め
実装コードは C/CPPファイルに
といったスタイルが多いと思います


C++/CLIでも ヘッダーに宣言のみ CPPファイルに実行コード
といった分離は可能です

ただし、イベントハンドラなどのデリゲートを追加したりする部分を
自前でコード化するのか IDE(デザイナ)でやるのかでコーディングの量は変わってくるでしょう

ハンドラをデザイナで追加して手作業で実行部分を分離するなら

private: System::Void Form1_Load( System::Object^ , System::EventArgs^ ) {
}
といった記述を

ヘッダー内では
private: System::Void Form1_Load( System::Object^ , System::EventArgs^ );
としておき

cppファイルに
#include "Form1.h"
using namespase プロジェクト名;

System::Void Form1::Form1_Load( System::Object^ , System::EventArgs^ )
{
  MessageBox::Show( L"Sample", L"Test" );
}
といった具合にします

private:は削除して関数名の前にその関数が属するクラス名を追加します

この回答への補足

ご回答、ありがとうございます。

サンプルソースを載せて頂いているので
非常にわかりやすいです。

現在、紹介頂いたサンプルソースを使用して
コーディングさせて頂いております。

補足日時:2009/04/13 04:23
    • good
    • 0

基本的に


*.hは関数やクラスの"インターフェース"(宣言)を書くもの、
*.cppはそれらの実装(定義)を書くものです。

STLなどの場合は拡張子が付かない
"ヘッダ"を用います。
しかし、拡張子がないだけで
役割は*.hとなんら変わりません。

最近はヘッダと実装の区別があいまいになり、
ヘッダに実装まで書く(厳密には、書かざるを得ない)
ケースも多いようです。

その典型が"テンプレート"でしょう。
例えば、リングバッファ
先頭と最後をつなげて"輪"のように使うバッファです。

基本的にはバイト単位で入出力できるタイプがあれば
用が足りるのですが、
効率化、プログラムの見通しの良さ
などを考え
例えば、WORD(2バイト)単位で入出力したい時が
あります。
わざわざ、2つを実装するのも面倒です。
こういうとき
テンプレートを使えば
1つの実装で両者に対応可能になり、
非常に便利です。

しかし、"テンプレート"とは
文字通り"型紙"でして、
実際に使用される際に、
指定された型に応じて展開されていくものです。

複数のモジュール(*.cpp)で片方(A.cpp)はBYTE版、
他方(B.cpp)はWORD版を使いたいとき、
テンプレートの情報は共有するので
ヘッダに共有する情報を書きます。

しかし、テンプレートは実装全体を展開していきます。
つまり、A,cppもB.cppもテンプレートの実装全部を知らなければ
展開不可能です。
この場合、ヘッダに実装全てを記述せざるを得ません。

よく言われる事ですが
"少ない知識で利用できるほどよい"
のであって
その点では
"実装を丸ごと取り込む"
のは最悪ともいえます。
だから、"テンプレートはダメ"
というのも非常に偏っていると考えます。

原則を踏まえつつも
柔軟な対応が必要
ではないでしょうか?

要するに
”ケース・バイ・ケース"
であり
場合によっては
ヘッダに定義まで書いてもOK
という考えです。

最近ではSTLに代表されるように
"テンプレート"ベースのライブラリも多くなってきました。

また、ソースを生成する
"ウィザード"
などでは
ヘッダに実装まで生成させるものも多いようです。
特に
.NET(ドットネット)系に多く見られます。
スクリプト系の言語をも考慮したためでしょうか?

VC6よりも2005/2008が汚く見えるのは
そのためと思われます。

あと、メンバー変数の頭にm_が付くのは
マイクロソフトが昔から勧めてきた方法です。
この場合の"m"は”member”の略と理解しています。
"my"の略ではないと思います。

メンバー変数はオブジェクトの状態を表すことが多く、
とても重要です。また、"カプセル化"に伴い
関数パラメータの格納先となることも多いのですが、
この際もメンバー変数を簡単に見分けられる方法として
m_はなかなか良いアイディアだと思います。
私も愛用しています。

この回答への補足

長文にわたるご回答、ありがとうございます。

申し訳ございませんが、私の現在の知識ですと
ご説明頂いた内容は難しいようです。

しかしながら、VC++6.0とVC++2005は違うようですね。
「ケースバイケース」という時が自分でわかるレベル
になるように、勉強いたします。

補足日時:2009/04/13 04:18
    • good
    • 0

参考書ではスペースの関係上「.h」に書いてあるだけです。


出来るだけ「.cpp」に書いた方がいいです。

変数名の先頭に「m」をつけているのは、
多分ですが、「my」(私の)の「m」、つまり、
私が作ったものという意味だと思います。

この回答への補足

早速のご回答、ありがとうございます。

どうして、cpp内にソースを書いたほうが宜しいのでしょうか?
****.hはヘッダーファイル(?)というものだから、
宣言のみ書くことが一般なのでしょうか?
例外はありますか?

矢継ぎ早の質問ですみません。

補足日時:2009/04/03 20:43
    • good
    • 0

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