• ベストアンサー

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クラスの作成などのことしか書いてないので、ちょっとわからなくて困っています。よろしくお願いします。

  • o-kou
  • お礼率90% (46/51)

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

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

ヘッダーの組み込み順序を #include "stdafx.h" #include "a.h" といった具合にしましょう 最初に stdafxを組み込むのが常套手段ですよ

o-kou
質問者

お礼

回答ありがとうございます。 ご指摘通りに修正しましたところ、無事解決いたしました。 やはり初歩的な問題だったようで、お手数おかけしまして申し訳ありませんでした。 ありがとうございました。

その他の回答 (2)

  • eternalx
  • ベストアンサー率35% (7/20)
回答No.2

一部わかりましたのでご報告致します。 A(void)の直前に型を指定できていませんので一部エラーが出てきていると思います。今、手元にVC++がないため正確なことはいえませんが、型を指定しなければいけません。詳細を見れば、何の型を指定すればいいのかがわかりますが、例えば以下の例ですと A.h------- #pragma once class A { public: int A(void); int ~A(void); }; A.cpp---------------------- #include "A.h" #include "StdAfx.h" int A::A(void) { } int A::~A(void) { } このようにしたほうがいいとコンパイラはいっているのではないでしょうか。型がかかれていないとint型として認識されるようです。

o-kou
質問者

お礼

ありがとうございます。 指摘いただいた通りに修正しましたところ、 確かに一部のエラーは回復しました。 しかし 'A' :識別子がクラス名でも名前空間名でもありません。 というエラーに関しては相変わらずの状態です。 クラス名でも、、ちゃんとクラスとして宣言してるのですけどね。。

  • eternalx
  • ベストアンサー率35% (7/20)
回答No.1

ヘッダファイルのパスや#pragmaで指定しているdllはあっているかは確認しましたか?

o-kou
質問者

お礼

回答ありがとうございます。 回答の意味が私の知識では把握できません。申し訳ないです。 こんな状態で質問するのは申し訳ないとは思っているのですが。 VC++で新規作成時にMFCを選んで、プロジェクトを作成し、 その状態でなにもせずにデバックをかけると、何の問題もなくなんでもないシングルウィンドウが開くことは問題ないと思います。 ですが、その状態で質問で書いたような新しいクラスを作っただけで、今のようなエラーがでるということなのです。 つまり問題がこの2つのファイルにしかないと思うのです。 もし、この2つのファイルをどこか別のファイルで参照しなければならないのならば、どこで参照しなければならないか教えていただけるでしょうか。 重ね重ねお願いいたします。

関連するQ&A

  • 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 を既定値としてサポートしていません というエラーが発生するのでしょうか? ネットで調べてもまったくわかりません わかる方お願いします

  • ヘッダのインクルード時のエラー

    初歩的な質問で恐縮です。 以下のようなファイルの構成でc++のプログラムを組んでいます。 <header.h> class H { public: virtual void func() = 0; }; <fileA.cpp> #include "header.h" class A : public H { public: void func() {} }; <fileB.cpp> #include "header.h" class B : public H { public: void func() {} }; <main.cpp> #include "fileA.cpp" #include "fileB.cpp" int main() { A a; B b; a.func(); b.func(); return 0; } これをビルドしようとすると、「クラス"H"を再定義しようとしています」とエラーが出てコンパイルができません。理屈は分かるのですが、これの対処方法が分かりません。この場合、header.hはJAVAにおけるInterfaceのような役割としてそれを使うfileA.cpp、fileB.cppの両者にインクルードしておきたいのです。これはどのようにして対処すべきなのでしょうか?

  • C++ クラスの作り方

    Windows10の上で、Visual Studio Community2015 を使ってC++を勉強中の者です。 Time クラスというのを定義して使おうとしましたが、クライアント側のプログラム作成中にエラーメッセージが出てきて、色々考えましたがどこが悪いのかわかりません。 プログラム自体は時刻を設定してそれを表示させるだけのものです。 詳しい方がいらっしゃいましたら、ご教授お願い致します。 問題のエラーメッセージ; "consoleApplication69.cpp" を作成中にエディターの中で、波型の赤線が出ているところにカーソルを持っていくと、次の3か所でそれぞれ次のようなエラーメッセージが出てきます。 (1) #include "time3.h" のところ: 「ソースファイルをひらけません。"time3.h"」 (2) 関数 incrementMinute( )のプロトタイプのところ:「不完全な型は使用できません。」 (3) 最初のパラメーター Time & のところ:「識別子 Time が定義されていません。」 以下に、 1: 私が作ったTimeクラスの定義のあるヘッダー "time3.h", 2: メンバー関数の定義ファイル "time3.cpp" 3:クライアント側プログラム "consoleApplication69.cpp" の3つのソースコードをコピーします。 "time3.cpp" については長いので、上の半分だけにしました。 ****************************************************** 1: "time3.h" ******************************************************** #pragma once // header file for Time class // time3.h #ifndef TIME3_H #define TIME3_H class Time { public: Time(int = 0, int = 0, int = 0); ~Time(); void setTime(int, int, int); void setHour(int); void setMinute(int); void setSecond(int); int getHour(); int getMinute(); int getSecond(); void printUniversal(); void printStandard(); private: int hour; int minute; int second; }; #endif *********************************************** 2: "time3.cpp" ************************************************ #include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> #include <cmath> #include <cstring> #include "time3.h" using namespace System; using namespace std; Time::Time(int hr, int min, int sec) { setTime(hr, min, sec); } void Time::setTime(int hr, int min, int sec) { setHour(hr); setMinute(min); setSecond(sec); } void Time::setHour(int hr) { hour = (0 <= hr && hr <= 23) ? hr : 0; } void Time::setMinute(int min) { minute = (0 <= min && min <= 59) ? min : 0; } void Time::setSecond(int sec) { second = (0 <= sec && sec <= 59) ? sec : 0; } ********************************************************* 3: "consoleApplication69.cpp" ********************************************************* // ConsoleApplication69.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include <iostream> #include <iomanip> #include "time3.h" using namespace System; using namespace std; //prototype void incrementMinute(Time &, const int); int main() { Time t; t.setHour(2); t.setMinute(10); t.setSecond(30); cout << " current time is "; cout << setfill('0'); cout << setw(2) << t.getHour() << ":"; cout << setw(2) << t.getMinute() << ":"; cout << setw(2) << t.getSecond() << "\n"; return 0; } // function void incrementMinute(Time &tt, const int num) { // まだ未定義 } またソリューションエクスプローラーの画面写真も添付します。 ヘッダーファイルもインクルードしていますし、ソリューションの中に入れたつもりですが、なぜ Time が定義されていないといわれるのでしょうか? どうぞよろしくお願いいたします。

  • CMainFrameからCPppView::OnFilePrintPreview();を呼びたい。

    環境はWIN98 VC++6.0 MFCです。 以下のようなコードで左クリックにて印刷プレビューが開きます。 void CPppView::OnLButtonDown(UINT nFlags, CPoint point) { CPppView::OnFilePrintPreview(); CView::OnLButtonDown(nFlags, point); } これをCMainFrameから呼びたくて、以下のようにしました。 #include "pppView.h" void CMainFrame::OnMenuitem32771() { CPppView::OnFilePrintPreview(); } すると以下のようなエラーが出てしまいます。 どうすればCMainFrame内で使えるようになりますか? よろしくご指導ください。 MainFrm.cpp c:\windows\デスクトップ\ppp\pppview.h(21) : error C2143: 構文エラー : ';' が '*' の前に必要です。 c:\windows\デスクトップ\ppp\pppview.h(21) : error C2501: 'CPppDoc' : 識別名を宣言するのに、型が指定されていません。 c:\windows\デスクトップ\ppp\pppview.h(21) : error C2501: 'GetDocument' : 識別名を宣言するのに、型が指定されていません。 C:\WINDOWS\デスクトップ\ppp\MainFrm.cpp(113) : error C2248: 'OnFilePrintPreview' : protected メンバ (クラス 'CView' で宣言されている)にアクセスできません。 c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(3660) : 'OnFilePrintPreview' の宣言を確認してください。 C:\WINDOWS\デスクトップ\ppp\MainFrm.cpp(113) : error C2352: 'CView::OnFilePrintPreview' : 静的でないメンバ関数の中で呼び出しが正しくありません。 c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(3660) : 'OnFilePrintPreview' の宣言を確認してください。 cl.exe の実行エラー

  • visual C++ 2005 でのイベントの作成

    visual C++ 2005 でのイベントの作成で困っています。 ダイアログ ベースのプログラミング http://oshiete1.goo.ne.jp/oshiete_new.php3 上記のサイトをはじめから実行していったのですが、「イベントハンドラ の追加」の部分で void CButtonDlg::OnBnClickedButton1() { // TODO: この位置にコントロール通知ハンドラ ... } の// TODO: この位置にコントロール通知ハンドラ ...の部分にサイトの 記述に有るような AfxMessageBox("第 1 のボタンを押しました。"); という記述をしたのですがこれをビルドするとエラーになります。 エラーメッセージは c:\documents and settings\asakawa\my documents\visual studio 2005\projects\ren\ren\rendlg.cpp(160) : error C2665: 'AfxMessageBox' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした c:\program files\microsoft visual studio 8\vc\atlmfc \include\afxwin.h(5025): 'int AfxMessageBox(LPCTSTR,UINT,UINT)' の 可能性があります。 c:\program files\microsoft visual studio 8\vc\atlmfc \include\afxwin.h(5027): または 'int AfxMessageBox(UINT,UINT,UINT)' 引数リスト '(const char [17])' を一致させようとしているとき と出ます。 何が原因でしょうか? ヒントでも良いんですが…

  • 新規クラスの使い方

    <環境> WIN98 VC++6.0 MFC  デフォルトでプロジェクトを作成。 オリジナルの新規クラスを作成。 新規クラス内でXXview.h内で宣言した変数を使いたいので 新規クラス内で#include <XXview.h>とすると、 error C2143: 構文エラー : ';' が '*' の前に必要です。等のエラーが出ます。 これを回避する方法を教えてください。

  • 別ソースファイル、同クラス名、同メンバ関数名で片方の関数しか呼ばれない

    環境は OS:Windows XP コンパイラ:C++Builder6 に付属の bcc32.exe です。 下の3つのソースファイルがあります。 bcc32 -c t1 bcc32 -c t2 bcc32 t t1.obj t2.obj でできる t.exe を実行すると、 f in t1.cpp f in t1.cpp と出力されます。 リンクエラーになるか、または f in t1.cpp f in t2.cpp と出力されることを期待したのですが・・・。 【質問】 複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい のですがどうしたらよいでしょうか? ---------------------------------------- t1.cpp #include <iostream.h> class A { public: void f(void); }; void A::f(void) { cout << "f in t1.cpp\n"; } void sub1(void) { A a; a.f(); } ---------------------------------------- t2.cpp #include <iostream.h> class A { public: void f(void); }; void A::f(void) { cout << "f in t2.cpp\n"; } void sub2(void) { A a; a.f(); } ---------------------------------------- t.cpp extern void sub1(void), sub2(void); void main(void) { sub1(); sub2(); }

  • stattime[p1] = GetTickCount(void);

    1: #include <windows.h> 2: #include <vector> 3: using namespace std; 8: vector < unsigned long > stattime; 12: stattime[p1] = GetTickCount(void); 17: *p1 = GetTickCount(void)-stattime[p2]; C:\desktop\HTC\htc.cpp(12) : error C2144: 構文エラー : ')' が型 'void' の前に必要です。 C:\desktop\HTC\htc.cpp(12) : error C2059: 構文エラー : ')' C:\desktop\HTC\htc.cpp(17) : error C2144: 構文エラー : ')' が型 'void' の前に必要です。 C:\desktop\HTC\htc.cpp(17) : error C2059: 構文エラー : ')' 必要と思われるとこだけ書いてみましたがエラーが出てしまいます どこが悪いのでしょうか? 使ってるソフトはVC++Ver6.0です

  • 互いのクラスで互いのクラスのポインタを持ち合う方法

    ◆hoge.h #pragma once #include "fuga.h" class Choge{ protected:  Cfuga *fuga; public:  Choge( void ){ fuga=new hoge(this); }  ~Choge(); }; ◆fuga.h #pragma once #include "hoge.h" class Cfuga{ protected:  Choge *hoge; public:  Cfuga( hoge *h ){ hoge=h; }  ~Cfuga(); }; このように互いのポインタを持ち合うようなクラスを作りたいのですが、 下記のようなエラーが出てどうにもうまくいきません。 c:\...\hoge.h(5) : error C2143: 構文エラー : ';' が '*' の前にありません。 c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません c:\...\hoge.h(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 環境はVisualC++2005(ExpressEdition)、WindowsXPです。 どうすれば実現できるでしょうか?

  • 【C++】関数からクラスに変更するには?

    いつも大変お世話になっています。 VC++初心者です。 関数をクラス化していきたいのですが、具体的にどのようにしたら良いか ご指導頂けませんでしょうか。 例えば、このようなソースがあった場合、どのようにクラス化させるのでしょうか。 (また、下記の例ですと、pulsとsubで1つのグループ、 goodMoringとgoodNightで1つのグループにさせる場合には どうすれば宜しいでしょうか。) //======================= //Tool.hの中身 //======================= int plus(int x, int y); int sub(int x, int y); void goodMorning(); void goodNight(); //======================= //Tool.cppの中身 //======================= #include <iostream.h> int plus(int x, int y){ return x + y; } int sub(int x, int y){ return x - y; } void goodMorning(){ cout << "おはよう\n"; } void goodNight(){ cout << "こんばんは\n"; } //======================= //Main.cppの中身 //======================= #include <iostream.h> #include "Tool.h" int main(){ int a = puls(1,1); cout << a <<'\n'; int b = puls(2,1); cout << b <<'\n'; goodMorning(); goodNight(); }