VisualStudio2005 C++ クラスの追加について

このQ&Aのポイント
  • プロジェクトでクラスを追加する際、ファイルコメントを同時に出力したいです。
  • クラス作成ウィザードの拡張やクラスのテンプレートの使用方法について教えてください。
  • VisualStudio2005におけるC++でのクラスの追加方法について知りたいです。
回答を見る
  • ベストアンサー

VisualStudio2005 C++ クラスの追加について

C/C++カテゴリですが質問内容はVisualStudio(C++)です。 当該しそうなカテゴリがなかったのでこちらに質問させて頂きます^^ [プロジェクト]-[クラスの追加]からクラスを作成する際、クラス名などをウィザード上で入力したら、.cpp/.h ができますよね。 内容としては、コンストラクタとデストラクタが書かれています。 これに決まったファイルコメントを同時に出力したいと考えています。 下に出力イメージを記します。 test.hの中身 ----------------------------------------------------------------- /*************************************************** * testクラスの宣言 * @author : * @see : ***************************************************/ /*↑を一緒に出力したい*/ /*↓は今まで通りの出力*/ #pragma once class test { public: test(); ~test(); }; ----------------------------------------------------------------- こんなことできますでしょうか? ・クラス作成ウィザードの実態はこいつでここをこう拡張すればできる ・クラスのテンプレートなるものがいて、そこに書いてやればいい のような回答で結構です。 ご存知の方はご教授ください:-)

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

本格的にウィザードを仕立てるのであれば カスタムウィザードについて調べてみてください IDEのマクロでやるなら マクロで ソリューションやプロジェクト、プロジェクトアイテムなどのコレクションから当該ウィンドウを特定します 取得できたら Selecttionプロパティを使って コメント部分を作成します 取得する場合そのヘッダファイルなどを編集状態にしておいてください 以下にサンプルコードを示します  Sub Macro01()   Dim oDTE As EnvDTE.DTE = DTE   Dim oSol As Solution = oDTE.Solution   ' 最初のプロジェクトを選択   ' 任意のプロジェクトを取得するのであれば   ' GetProjtItem関数を参考にしてください   Dim oProj As Project = oSol.Projects.Item(1)   ' 2番目の引数に 取得したいファイル名を指示します   Dim oItem As ProjectItem = GetProjItem(oProj.ProjectItems, "MySample.h", 0)   Dim oSel As TextSelection = CType(oItem.Document.Selection, TextSelection)   oSel.StartOfDocument()   oSel.SelectLine()   ' 先頭行が#pragma onceならば コメントを追加   If oSel.Text = "#pragma once" & vbCrLf Then    oSel.StartOfDocument()    oSel.NewLine()    oSel.LineUp()    ' テストコードなので固定文字列で追加しています    ' 必要に応じて InputBoxなどを使って文字列を変更してください    oSel.Text = "/*************************************" & vbCrLf & _          "* CMySampleクラスの宣言" & vbCrLf & _          "* @author: " & vbCrLf & _          "* @see: " & vbCrLf & _          "*************************************/" & vbCrLf   End If  End Sub  Function GetProjItem(ByVal oProjcts As ProjectItems, ByVal sName As String, ByVal level As Integer) As ProjectItem   Dim oItem As ProjectItem   Dim subProj As ProjectItems   ' 与えられたコレクションを検索   For Each oItem In oProjcts    ' 検索中のアイテムが 引数と一致するか検査    If oItem.Name = sName Then     ' 発見されたアイテム     Return oItem    Else     ' もし違うのであれば その項目の子アイテムを再帰で探索     subProj = oItem.ProjectItems     If subProj.Count Then      Dim oItem2 As ProjectItem      oItem2 = GetProjItem(subProj, sName, level + 1)      ' 子アイテムに目的のアイテムが見つかった場合はこれを返す      If Not oItem2 Is Nothing Then       Return oItem2      End If     End If    End If   Next   Return Nothing  End Function # 字下げは全角スペースを使用しています 半角スペースなどに置換してください

SafeGuard
質問者

お礼

お早い回答ありがとうございます。 "カスタムウィザード"といわれているのですね。 言葉の糸口が見つかれば、何とかなりそうです。 スクリプトの例も参考になりそうです。 ありがとうございました。

関連するQ&A

  • 初心者です。VisualStudioについて教えてください。(C++)

    初心者です。VisualStudioについて教えてください。(C++) VisualStudioのWindowsフォームプロジェクトを作成すると 「Form1」という簡易画面が自動で作成されます。 その画面にボタン等を追加していくと、そのボタン押下時の処理が 「Form1.h」にどんどん追加されていきます。 なぜヘッダファイルに処理の実装を記述していくのでしょうか? 基本的に、ヘッダとは関数やクラスを定義するだけのもので 実装はcppファイルに記述していくものだと研修等で教わったのですが。 なぜなのでしょう? ご教授下さい。 また、「Form1.h」ではなく「*.cpp」ファイルに実装を記述したい場合 どうのようにすればよいのでしょうか?

  • C++のクラスの仮想デストラクタについて

    C++のクラスの仮想デストラクタについて教えてください。 デストラクタは、クラスの名前の前にチルダを付けたものが名前になりますが、とあるクラスの継承クラスは、その親クラスとクラス名が違うので、デストラクタの名前も親クラスのものとは別になる。つまり。継承関係のあるクラスでもデストラクタはオーバーライドせず、各クラス毎に別の名前で存在する、ということになると思います。 ですので http://wisdom.sakura.ne.jp/programming/cpp/cpp31.html このページの下部にあるように、「デストラクタは、派生クラスから基本クラスへ向かって順番に呼び出される」というのもなんとなく合点が行きます。 しかし、仮想デストラクタというものがあることを知りました。 上記のようにデストラクタは継承関係のあるクラス間でも、それぞれクラス毎に作ればよいと思っていましたが、子クラスの方でオーバーライドする必要がある場合があるのでしょうか。あるとすれば、それはどんな場合なのでしょうか。 また、上記のURLでは、「C++ 言語のデストラクタはオーバーライドを行いません」と書いてあり、なんだかよく分からなくなってきました。仮想デストラクタというものが存在するのに? どなたか詳しい方いらっしゃいましたらご教示頂けると幸いです。

  • Visual C++ 2005 MFCアプリのクラス作成について

    Windows XP SP3 Visual C++ 2005 pro MFCアプリケーション シングルドキュメント 以上の環境でアプリケーションを作りたいと思っています。 C++は、C言語をベースという意味ではそれなりにはわかっているつもりです(自信はないですが...)。 本当はSDKを学んだ方がよろしいんでしょうが、時間の都合上MFCでやることにしました。 ちなみに、VC++を使ったプログラミングは初めてのものです。 そこで質問なのですが、 通常のC++においてクラスを作るときは、cppファイルとhファイルで分けてつくってmainのcppでインクルードしますよね。 VC++ MFCも 「C++クラスの追加」 でウィザードを利用してあるクラスAを作成てみまして、わかる方にはわかるでしょうけど、もちろん以下のように出力されました。 A.h------------------ #pragma once class A { public: A(void); public: ~A(void); }; A.cpp---------------------- #include "A.h" #include "StdAfx.h" A::A(void) { } A::~A(void) { } そしてとりあえず、その状態で何も手を加えずにとりあえずコンパイルにかけてみたところいきなり以下のようなエラーが出ました。 error C2653: 'A' :識別子がクラス名でも名前空間名でもありません。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません warning C4508: 'A' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 error C2653: 'A' : 識別子がクラス名でも名前空間名でもありません fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します 何も手を加えていない状態でこのようなエラーが出るということは、どこかでこのhやcppをインクルードする必要があるのだろうとは思います(でもそういう類のことはウィザードで作成した際に、VC++が自動でコーディングしてくれたりしないのでしょうかね...)。 むしろ、MFCでこのような単純なC++クラスを作ること自体があまり好まれないことなのでしょうか。 もちろんこのクラスを作っていってから、ある処理をさせていこうと思っているので、自分としては以前から行っていたC++のようにコーディングしていきたいと思うのですが、もし好ましくないようならどのファイルにMFC的ではない、ただのC++的なクラスを定義したりすればよろしいのでしょうか。 もしくは、好ましくなくても何らかの対処方法があれば教えていただきたく思います。 Webで調べても MFCクラスの作成などのことしか書いてないので、ちょっとわからなくて困っています。よろしくお願いします。

  • クラスについての基本的な質問です

    こんにちは。 クラスを使ってプログラミングしていて、どうしたらいいかわからなくなってしまったので質問させてください。 1つのクラスを2つのクラスが継承している状態で、多重定義エラーが出てしまっています。 ---------- base.h class BaseClass { public: BaseClass(); ~BaseClass(); protected: class InnerClass { public: InnerClass(); virtual ~InnerClass(); } }; ---------- Aclass.h class AClass : public BaseClass { public: AClass(); ~AClass(); }; ---------- BClass.h class BClass : public BaseClass { public: BClass(); ~BClass(); }; ---------- 上記状態で、AClass.cpp、BClass.cpp内で AClass::InnerClass::~InnerClass() { } のようにコンストラクタやデストラクタ等を作っています。 BaseClass.cppにはInnerClassに関するものは書いていません。 「AClassのInnerClassのデストラクタ」というような書き方だと思うのですが、 BClass.o: multiple definition of 'BaseClass::InnerClass::~InnerClass()' AClass.o: previous definition here のように、後にビルドしたものがBaseClassについて多重定義になっているようです。 なぜ多重定義になってしまうのでしょうか? わかりにくいことがあったら言ってください。 補足等しようと思います。 よろしくお願いします。

  • VisualStudioから設計書を起こしたい

    VisualStudioでは、 (1)オブジェクトブラウザー?で各クラスのメソッド名、引数が見れますが、それを出力したいです。 (2)関数の上に記載した、<Summary>の内容を出力したいです。 最近のVisualStudioでできるか?やVisualStudio2005でできるか?までご存知であればご教授願いたいです。

  • C++Builderのクラス

    普段、新規アプリケーションの作成で、TForm1クラスでプログラミングしています。ここに、例えば、Xクラスなどを追加作成したいのですが、.hファイルに記述するのか、.cppファイルに記述すべきなのか教えてください。

  • VC++6.0で、ダイアログを新規に作成し、クラスウィザードでそのダイ

    VC++6.0で、ダイアログを新規に作成し、クラスウィザードでそのダイアログにクラスを割り当てる時 「クラス"CAbcDlg"のファイル(..¥AbcDlg.h, ..¥AbcDlg.cpp)を開けません」という エラーメッセージが出て、新しいクラスを作れません。何故でしょうか? 注1)正しく作れることもあります。 注2)出来てしまったAbcDlg.hとAbcDlg.cppファイルを削除して、   同じ操作をすると新しいクラスは作れます。

  • VisualC++でクラスのヘッダーファイルの書き方がわかりません

    今、Visual C++(CLR)を使って、MultiClassという名前のクラスを作っています。 クラスの作り方は大体わかったのですが、 疑問が出ました。以下のように記述するとエラーが発生してしまいます //クラスのヘッダーファイル #pragma once ref class MultiClass { public: void MultiClass(void); }; //クラスのCPPファイル #include "StdAfx.h" #include "MultiClass.h" void MultiClass::MultiClass(void) { } //エラー名 エラー 1 error C2380: 前の型 'MultiClass' (コンストラクタが戻り値の型を返すか、またはクラス名を再定義しています。) エラー 2 error C2533: 'MultiClass::{ctor}' : コンストラクタの宣言に戻り値の型が含まれています。 ヘッダーで先頭voidを消して、CPPの先頭voidを消したら正常に 動作するのですが、普通、 戻り値 メソッド名 (引数) なのに、なぜエラーが発生するのですか? さらに2行目以降はなぜ、 void を先頭につけないと エラー 2 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません というエラーが発生するのでしょうか? ネットで調べてもまったくわかりません わかる方お願いします

  • ClassViewからクラスが消えました。復旧方法を教えてください。

    ClassViewからクラスが何故か消えてしまいました、復旧する方法を教えてください。(FileViewには.cppも.hもあります。) ダイアログを作りクラスウィザードでクラスを新規作成しそのクラスのソースファイルを直していた所、ClassViewからクラスが消えました。原因と復旧する方法を教えてください。

  • C++/STLの動作

    お世話になっております。 クラスのインスタンス化時に自身のポインタをストックしようと下記を実行しましたが、 出力が0となり、予想に反していました。 そこで、"test.cpp"の3行目を"main.cpp"に移動すると正しく動作します。 これはどういった動作が原因で起こったのでしょうか? よろしくお願いします。 /// test.h /// #include <vector> class Test { public: Test(){list.push_back(this);} static std::vector<Test*> list; }; /// test.cpp /// #include "test.h" std::vector<Test*> Test::list; /// main.cpp /// #include <stdio.h> #include "test.h" Test test; void main() { printf( "%d\n", test.list.size() ); // "1"と出力されると思ったけど… }

専門家に質問してみよう