プロが教えるわが家の防犯対策術!

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

A 回答 (3件)

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

    • good
    • 0
この回答へのお礼

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

回答の意味が私の知識では把握できません。申し訳ないです。
こんな状態で質問するのは申し訳ないとは思っているのですが。

VC++で新規作成時にMFCを選んで、プロジェクトを作成し、
その状態でなにもせずにデバックをかけると、何の問題もなくなんでもないシングルウィンドウが開くことは問題ないと思います。

ですが、その状態で質問で書いたような新しいクラスを作っただけで、今のようなエラーがでるということなのです。
つまり問題がこの2つのファイルにしかないと思うのです。

もし、この2つのファイルをどこか別のファイルで参照しなければならないのならば、どこで参照しなければならないか教えていただけるでしょうか。

重ね重ねお願いいたします。

お礼日時:2009/09/07 16:57

一部わかりましたのでご報告致します。


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型として認識されるようです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

指摘いただいた通りに修正しましたところ、
確かに一部のエラーは回復しました。

しかし
'A' :識別子がクラス名でも名前空間名でもありません。

というエラーに関しては相変わらずの状態です。
クラス名でも、、ちゃんとクラスとして宣言してるのですけどね。。

お礼日時:2009/09/07 17:34

ヘッダーの組み込み順序を


#include "stdafx.h"
#include "a.h"
といった具合にしましょう

最初に stdafxを組み込むのが常套手段ですよ
    • good
    • 0
この回答へのお礼

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

ご指摘通りに修正しましたところ、無事解決いたしました。

やはり初歩的な問題だったようで、お手数おかけしまして申し訳ありませんでした。
ありがとうございました。

お礼日時:2009/09/07 17:59

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