VisualStudio2005C++の参考書のプログラムでエラー

このQ&Aのポイント
  • VisualStudio2005でC++の勉強中に、プログラムのエラーが発生しました。
  • 参考書通りに書いたつもりの「Hello, Visual C++」の表示プログラムで、エラーが出ています。
  • エラーメッセージは「error C2664: 'BOOL CDC::TextOutW(int,int,const CString &)' : 3 番目の引数を 'const char [19]' から 'const CString &' に変換できません」となっています。
回答を見る
  • ベストアンサー

VisualStudio2005C++の某参考書のプログラムでエラー

最近VisualStudio2005でC++を勉強しているものです。 そこで、まずは画面に「Hello, Visual C++」と表示させる プログラムを参考書通りに書き換えたつもり(?)なのですが、 エラーがでます。 どなたか理由を教えてください。人生初のC++で出だしからつまづくなんて・・・ 以下がそのプログラムです。 // helloVCView.cpp : ChelloVCView クラスの実装 // #include "stdafx.h" #include "helloVC.h" #include "helloVCDoc.h" #include "helloVCView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // ChelloVCView IMPLEMENT_DYNCREATE(ChelloVCView, CView) BEGIN_MESSAGE_MAP(ChelloVCView, CView) // 標準印刷コマンド ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) END_MESSAGE_MAP() // ChelloVCView コンストラクション/デストラクション ChelloVCView::ChelloVCView() { // TODO: 構築コードをここに追加します。 } ChelloVCView::~ChelloVCView() { } BOOL ChelloVCView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } // ChelloVCView 描画 void ChelloVCView::OnDraw(CDC* pDC) { ChelloVCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 pDC->TextOut(0, 0, "Hellow, Visual C++"); } // ChelloVCView 印刷 BOOL ChelloVCView::OnPreparePrinting(CPrintInfo* pInfo) { // 既定の印刷準備 return DoPreparePrinting(pInfo); } void ChelloVCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 印刷前の特別な初期化処理を追加してください。 } void ChelloVCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 印刷後の後処理を追加してください。 } // ChelloVCView 診断 #ifdef _DEBUG void ChelloVCView::AssertValid() const { CView::AssertValid(); } void ChelloVCView::Dump(CDumpContext& dc) const { CView::Dump(dc); } ChelloVCDoc* ChelloVCView::GetDocument() const // デバッグ以外のバージョンはインラインです。 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(ChelloVCDoc))); return (ChelloVCDoc*)m_pDocument; } #endif //_DEBUG // ChelloVCView メッセージ ハンドラ これでデバッグすると、 以下の文言が・・・ ------ ビルド開始: プロジェクト: helloVC, 構成: Debug Win32 ------ コンパイルしています... helloVCView.cpp c:\documents and settings\hellovc\hellovc\hellovcview.cpp(56) : error C2664: 'BOOL CDC::TextOutW(int,int,const CString &)' : 3 番目の引数を 'const char [19]' から 'const CString &' に変換できません。(新しい機能 ; ヘルプを参照) 理由: 'const char [19]' から 'const CString' へは変換できません。 class 'ATL::CStringT<BaseType,StringTraits>' のコンストラクタが 'explicit' と宣言されています。 with [ BaseType=wchar_t, StringTraits=StrTraitMFC_DLL<wchar_t> ] ビルドログは "file://c:\Documents and Settings\helloVC\helloVC\Debug\BuildLog.htm" に保存されました。 helloVC - エラー 1、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ========== ========== 配置: 0 正常終了、0 失敗、0 スキップ ========== この情報だけで、 何か間違いが見つかるんでしょうか。 なにせ超初心者なので、 何が何だかでパニックってます。 どうぞお力をお貸し下さい。

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

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

VS2005になって 作成したソリューション(プロジェクト)の規定の文字セットが Unicodeになっています CDC::TextOutなど 文字列の引数を扱う場合 _Tマクロか、_TEXTマクロを使用するようにしましょう void ChelloVCView::OnDraw(CDC* pDC) { ChelloVCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 // この部分の 文字定数を _TEXTで括ります pDC->TextOut(0, 0, _TEXT("Hellow, Visual C++")); } もし _TEXTが未定義だといわれるようなら ファイルの先頭付近の #include "afxstd.h" の次の行に #include <TCHAR.H> を追加してください

TaruSimba
質問者

お礼

redfox63様へ 早速の回答ありがとうございました。 うまく走ることができました。 今、すごい感激です。 生まれて初めてプログラムを走らせたなんて♪ _Tマクロ、_TEXTマクロ ってなんですか・・・  今持ってる参考書は 「明快入門Visual C++2005 ビギナー編」 なんですが、 そこに書いている通りに打ち込んでエラーがでたのです。 この本って、あまりよくないのでしょうか。 _Tマクロ、_TEXTマクロの事かいてないのですが・・・ 質問攻めですいません。 とにかく、 走ったので、すごく嬉しいです。

その他の回答 (1)

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

MicrosoftのOSで使用される文字コード体系が2種類あることはご存知でしょうか? DOSやWin3.1、Win9x系で主に使用されてきた文字コード ANSIとかSBCS,MBCSといったコード体系と WinNT,Win2000,WinXP,VISTAなどで用いられる Unicode この2つのコード体系の差を吸収するためのマクロということになります 下記URLなどを一読してみましょう

参考URL:
http://msdn.microsoft.com/library/ja/vccore/html/_core_Generic.2d.Text_Mappings_in_TCHAR..H.asp?frame=true
TaruSimba
質問者

お礼

redfox63様へ うーん。難しいですね。 といいますか、 初めてなので、 何が何だかという感じです。 とりあえず、コード体系の差の吸収ということは、 覚えました。 リンクありがとうございました。 でも、あまりよくわかりません。 どんどん勉強して、 分かるようになりたいと思います。 どうもありがとうございました。

関連するQ&A

  • CFromViewの OnDrawメソッドについて

    MFC初心者です。VC2005でグラフィックスに挑戦しております。 まだよくクラスとか、MFCの作法などしらないのでトンチンカンな質問をしますが、 ドキュメント(で正しいでしょうか?)がCViewクラスの場合、 OnDraw(CDC* pDC)が定義されていたので、直接そこに描画コードを書きましたが、 CFromViewクラス(コントロール可能)の場合、 OnDraw(CDC* pDC)が見当たりませんので、定義にvoid OnDraw(CDC* pDC)を追加し、 以下のようにメソッドを追加して、無理やり表示させました。 この方法は普通でしょうか? void CtestView::OnDraw(CDC* pDC) { CBrush myBrush; CBrush* pOldBrush; myBrush.CreateSolidBrush(RGB(255,0,0)); // ソリッドブラシの作成 pOldBrush = pDC->SelectObject(&myBrush); // myBrushを選択 pDC->Ellipse(60,10,160,110); pDC->SelectObject(pOldBrush); // 元に戻す myBrush.DeleteObject(); // ブラシを削除 } //--------------------------------------------------- 以下クラス定義部 class CtestView : public CFormView { protected: // シリアル化からのみ作成します。 CtestView(); DECLARE_DYNCREATE(CtestView) public: enum{ IDD = IDD_test_FORM }; // 属性 public: CtestDoc* GetDocument() const; // 操作 public: // オーバーライド public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート virtual void OnInitialUpdate(); // 構築後に初めて呼び出されます。 // 実装 public: virtual ~CtestView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif void OnDraw(CDC* pDC); /////////////////////////// ←勝手に追加 protected: // 生成された、メッセージ割り当て関数 protected: DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // testView.cpp のデバッグ バージョン inline CtestDoc* CtestView::GetDocument() const { return reinterpret_cast<CtestDoc*>(m_pDocument); } #endif

  • ダブルバッファについて

    スタート画面にBitmapを用いたアニメーションを用いて、次の場面に移動したいのですが 実行すると画面がちかちかしてしまいます。どう直せばよいか教えてもらえると助かります プログラムはVisualStudio2008のMFCでやっています #include "stdafx.h" #include "graph.h" #include "graphDoc.h" #include "graphView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif //全域変数 CDC bkDC; CBitmap bkBMP; #define ID_REDRAW 30 #define TIMER_MS_FPS 1000/30 #define ID_BITMAP 60 #define TIMER_MS_BITMAP 300 #include <math.h> int draw_state = 0; float mouse_x = -1.0, mouse_y = -1.0; // CgraphView IMPLEMENT_DYNCREATE(CgraphView, CView) BEGIN_MESSAGE_MAP(CgraphView, CView) // 標準印刷コマンド ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) ON_COMMAND(ID_BK_WHITE, &CgraphView::OnBkWhite) ON_COMMAND(ID_BK_BLUE, &CgraphView::OnBkBlue) ON_COMMAND(ID_BK_PINK, &CgraphView::OnBkPink) ON_WM_TIMER() ON_WM_DESTROY() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() // CgraphView コンストラクション/デストラクション CgraphView::CgraphView() : background_color(0) , draw_state(0) , Bmp_ID(0) { // TODO: 構築コードをここに追加します。 background_color = 0; int draw_state = 0; } CgraphView::~CgraphView() { } BOOL CgraphView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } // CgraphView 描画 void CgraphView::OnDraw(CDC* pDC) { CgraphDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 //ダブルバッファに関するコード CRect rc; GetClientRect(&rc); bkDC.CreateCompatibleDC(pDC); bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom); bkDC.SelectObject(&bkBMP); //描画は、裏画面bkDCにおいて行う bkDC.FillSolidRect(rc, RGB(153, 204, 255)); int x, y, sx, sy; if(draw_state == 0) { bkDC.SetTextColor(RGB(255, 255, 255)); bkDC.TextOut(480, 580, _T("Start")); sx = 128; sy = 128; y = 340; x = 200; draw_school(x, y, sx, sy);//定義は省略 x = 400; draw_health(x, y, sx, sy);//定義は省略 x = 600; draw_environment(x, y, sx, sy);//定義は省略 } else if(draw_state == 1) { CRect myRect; GetClientRect(myRect); pDC->FillSolidRect(myRect, RGB(0, 0, 0)); } //裏画面を表画面に送る //pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY); //裏画面を消去 bkBMP.DeleteObject(); bkDC.DeleteDC(); //実行画面のプログラムを省略    void CgraphView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 bitmap[0].LoadBitmap(IDB_BITMAP1); bitmap[1].LoadBitmap(IDB_BITMAP2); bitmap[2].LoadBitmap(IDB_BITMAP3); bitmap[3].LoadBitmap(IDB_BITMAP4); bitmap[4].LoadBitmap(IDB_BITMAP5); bitmap[5].LoadBitmap(IDB_BITMAP6); //タイマーをスタート SetTimer(ID_BITMAP, TIMER_MS_BITMAP, NULL); //画面再描画のタイマーをスタートする SetTimer(ID_REDRAW, TIMER_MS_FPS, NULL); Bmp_ID = 0; } void CgraphView::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if(nIDEvent == ID_BITMAP) Bmp_ID = (Bmp_ID+1) % 2; if(nIDEvent == ID_REDRAW) InvalidateRect(NULL, FALSE); CView::OnTimer(nIDEvent); } void CgraphView::OnDestroy() { CView::OnDestroy(); // TODO: ここにメッセージ ハンドラ コードを追加します。 KillTimer(ID_BITMAP); KillTimer(ID_REDRAW); } void CgraphView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 mouse_x = point.x; mouse_y - point.y; if(draw_state == 0) { if(mouse_x > 420 && mouse_y > 500) { draw_state = 1; } } CView::OnLButtonDown(nFlags, point); } //以下は関数の定義なので省略

  • MFCプログラミング

    MFCのダブルバッファリングを用いて画面を切り替えるプログラムを作ったのですが 画面がちらついてしまいます、どう修正すればよいか教えてください // CgraphView 描画 void CgraphView::OnDraw(CDC* pDC) { CgraphDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: この場所にネイティブ データ用の描画コードを追加します。 CRect myRect; GetClientRect(myRect); if(background_color == 0) pDC->FillSolidRect(myRect, RGB(255, 255, 255)); else if(background_color == 1) pDC->FillSolidRect(myRect, RGB(153, 204, 255)); else pDC->FillSolidRect(myRect, RGB(255, 153, 204)); //ダブルバッファに関するコード CRect rc; GetClientRect(&rc); bkDC.CreateCompatibleDC(pDC); bkBMP.CreateCompatibleBitmap(pDC, rc.right, rc.bottom); CBitmap Bitmap, *pOldBitmap; pOldBitmap = bkDC.SelectObject(&bkBMP); //これから、すべての描画は、裏画面bkDCにおいて行う bkDC.FillSolidRect(rc, RGB(255, 255, 255)); int x, y, sx, sy; if(draw_state == 0) { bkDC.SetTextColor(RGB(0, 0, 0)); bkDC.TextOut(400, 500, _T("Start")); sx = 128;//表示するビットマップの横の大きさ sy = 128;//表示するビットマップの縦の大きさ y = 300;//表示するビットマップの左上の頂点のy座標 x = 50; draw_school(x, y, sx, sy); x = 200; draw_health(x, y, sx, sy); x = 350; draw_environment(x, y, sx, sy); } else if(draw_state == 1) { CRect myRect; GetClientRect(myRect); pDC->FillSolidRect(myRect, RGB(255, 255, 255)); } //裏画面bkDCにおいて、すべての描画を行った後 //裏画面を表画面に送る pDC->BitBlt(0, 0, rc.right, rc.bottom, &bkDC, 0, 0, SRCCOPY); bkDC.SelectObject(pOldBitmap); //裏画面を消去 bkBMP.DeleteObject(); bkDC.DeleteDC(); void CgraphView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。 bitmap[0].LoadBitmap(IDB_BITMAP1); bitmap[1].LoadBitmap(IDB_BITMAP2); bitmap[2].LoadBitmap(IDB_BITMAP3); bitmap[3].LoadBitmap(IDB_BITMAP4); bitmap[4].LoadBitmap(IDB_BITMAP5); bitmap[5].LoadBitmap(IDB_BITMAP6); Bmp_ID = 0; //タイマーをスタート SetTimer(ID_BITMAP, TIMER_MS_BITMAP, NULL); //画面再描画のタイマーをスタートする SetTimer(ID_REDRAW, TIMER_MS_FPS, NULL); Bmp_ID = 0; } void CgraphView::OnTimer(UINT_PTR nIDEvent) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if(nIDEvent == ID_BITMAP) Bmp_ID = (Bmp_ID+1) % 2; if(nIDEvent == ID_REDRAW) InvalidateRect(NULL, FALSE); CView::OnTimer(nIDEvent); } void CgraphView::OnDestroy() { CView::OnDestroy(); // TODO: ここにメッセージ ハンドラ コードを追加します。 KillTimer(ID_BITMAP); KillTimer(ID_REDRAW); } void CgraphView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 mouse_x = point.x; mouse_y = point.y; if(draw_state == 0) { if(mouse_x > 400 && mouse_y > 500) { draw_state = 1; } } CView::OnLButtonDown(nFlags, point); } BOOL CgraphView::OnEraseBkgnd(CDC* pDC) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 return TRUE; //return CView::OnEraseBkgnd(pDC); }

  • 画像の印刷について

    環境はWIN98 VC++6.0 MFCです。 初めて印刷に挑戦します。 TextOut()で書いた文字は印刷プレビューでちゃんと表示されましたが、以下のようにして取りこんだ画像を印刷プレビューで見ても何も表示されません。 どうしたら印刷できるようになりますか? void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); }

  • CDCオブジェクトの作成について

    // あまり意味はないのですが、 //CDCのオブジェクトを宣言して、 //そこへ図形を描画して、 //クライエント領域にBitBltするときは、 //どうすればいいですか? //CreateCompatibleDCが関係していると思っています。 //ですが、上手く描画できません。 //教えてください、 //お願いします。 void CProject1View::OnDraw(CDC* pDC) { CProject1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; ////////////////////////////////////////////////////// CDC imageDC; CPen pen,*oldpen; pen.CreatePen(PS_SOLID,3,RGB(255,0,0)); imageDC.CreateCompatibleDC(pDC); for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { imageDC.SetPixel(i,j,RGB(128,0,0)); } } oldpen=imageDC.SelectObject(&pen); imageDC.Rectangle(50,50,400,300); pDC->BitBlt(0,0,600,600,&imageDC,0,0,SRCCOPY); imageDC.SelectObject(oldpen); ////////////////////////////////////////////////////// }

  • C++のvectorについて教えてください。

    C++のvectorについて教えてください。 現在悩んでいる問題について簡単に説明するために、テストコードを書きました。 #include <vector> class IntType { private: int num; public: IntType( int n ):num( n ){}; }; std::vector< IntType > IntVector; void main() { } このコードをDebug版でコンパイルすると 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(285) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'const size_t' から減少できませんでした 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2236) : 'std::operator <' の宣言を確認してください。 のようなエラーが出ます。 しかし、Release版でコンパイルするとコンパイルは通ります。 Debug版でコンパイルを通すにはどのようなコードを追加すればよいでしょうか? 知恵を貸してください。 よろしくおねがいします。 /** VisualStudio2008 AcademiEdition */

  • C++のファイルの分割について教えてください。

    分割したプログラムの書き方を練習中なのですが、 下のようなプログラムを書いて、ビルドしようとしたら失敗します。 どこが悪いのか、教えていただけないでしょうか? (5)\test30\Debug\test30.exe : fatal error LNK1120: 外部参照 1 が未解決です。 1>test30 - エラー 2、警告 0 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== //test30.cpp #include <iostream> #include "sub.h" int main(void) { std::cout<<"メインプログラムです。"<<std::endl; sub1(); sub2(); return 0; } ------------------------------------------------------------- //sub1.cpp #include <iostream> void sub1(void) { std::cout<<"サブ1です。"<<std::endl; } ------------------------------------------------------------- //sub2.cpp #include <iostream> void sub1(void) { std::cout<<"サブ2です。"<<std::endl; } --------------------------------------------------------------- //sub.h void sub1(void); void sub2(void);

  • DirectInput でのエラー

    LPDIRECTINPUT8 m_pDI; LPDIRECTINPUTDEVICE8 m_pJoystick; 省略 // ゲームコントローラーの列挙 if(FAILED(hr = m_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCalback, NULL, DIEDFL_ATTACHEDONLY))) return hr; //********************************************************/ BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { HRESULT hr; hr = m_pDI->CreateDevice(pdidInstance->guidInstance, &m_pJoystick, NULL); if(FAILED(hr)){ return DIENUM_CONTINUE; }else{ return DIENUM_STOP; } } ゲームコントローラーの列挙をするためのコードを msdn や DirectXSDK のサンプルを 参考に書きました。でもどうしても以下のようなエラーがでます。 キャストなど試してみましたが解決にはいたりませんでした。 どうかご教授おねがいします。 d:\○○△△.cpp(30) : error C2664: 'IDirectInput8A::EnumDevices' : 2 番目の引数を 'BOOL (const DIDEVICEINSTANCE *,void *)' から 'LPDIENUMDEVICESCALLBACKA' に変換できません。

  • VisualStudio.netのC++でC言語の勉強をしたいです

    VisualStudio.netのC++でC言語の勉強をしようと思っているのですが C言語のコンパイルの仕方がわかりません。 新規プロジェクト>>WIN32>>win32コンソールプロジェクト でプロジェクトを開きソースを書いてビルドしてみると エラー出てしまいました。 「fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。」 ソースは以下のとおりです。 #include <stdio.h> void hello(void); void hello(void) { printf("hello"); return; } int main(void) { hello(); return 0; } C言語をコンパイルする方法に間違ったことをしているのでしょうか? それともソースのバグなのでしょうか? 初心者質問ですがよろしくお願いいたhします。

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

    初歩的な質問で恐縮です。 以下のようなファイルの構成で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の両者にインクルードしておきたいのです。これはどのようにして対処すべきなのでしょうか?

専門家に質問してみよう