2016-07-18 47 views
0

OpenGLとMFCを使用してC++で3Dペインタを構築しています。 私が持っているすべての図形を作成するためのダイアログを作成しました:キューブ、円柱など... 私のcubeクラスは、スタックとスライスの量の差だけを使ってシリンダクラスを継承します。 したがってCreateCylinderダイアログはCreateCubeダイアログと同じに見えるはずです。 私は罰金それを継承することができましたが、私は言うエラーがあります:MFCで正しくダイアログを継承する方法

Error 6 error C2065: 'IDD_BASEWIN_DIALOG' : undeclared identifier c:\users\l122\desktop\opengl\opengl\basewindlg.h 19 1 OpenGL 

をこれは、いくつかのマイナーコードの変更後にすべての新しいコンパイルを起こるが。それを修正する

、私はこの行をコメント:

enum { IDD = IDD_BASEWIN_DIALOG }; 

その後、正常に動作するには、次のコンパイルに役立ちます同じ行を、コンパイルしてコメントを解除します。

それ私は私のCREATECUBEダイアログクラスにCreateCylinderダイアログクラスを継承する方法:

IMPLEMENT_DYNAMIC(CreateCube, CreateCylinder) 

CreateCube::CreateCube() 
: CreateCylinder(this->GetSafeOwner()) 
{ 

} 

CreateCube::~CreateCube() 
{ 
} 


void CreateCube::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialogEx::DoDataExchange(pDX); 
    CreateCylinder::DoDataExchange(pDX); 
} 


BEGIN_MESSAGE_MAP(CreateCube, CreateCylinder) 
END_MESSAGE_MAP() 

と私はまた、CreateCylinderコンストラクタでこの行に編集:

CreateCylinder::CreateCylinder(CWnd* pParent /*=NULL*/) 
: CDialogEx(CreateCylinder::IDD, this->GetSafeOwner()) 

ヘッダファイル:

#pragma once 
#include "CreateCylinder.h" 

// CreateCube dialog 

class CreateCube : public CreateCylinder 
{ 
    DECLARE_DYNAMIC(CreateCube) 

public: 
    CreateCube(); // standard constructor 
    virtual ~CreateCube(); 

// Dialog Data 
    enum { IDD = IDD_CREATE_CUBE_DLG }; 

protected: 
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

    DECLARE_MESSAGE_MAP() 
}; 

私は相続に何が間違っているか知りたいです。私は基本的なダイアログに親のポインタを送る必要がありますか? 上記のエラーは何かをしなければならないのですか?

+0

ヘッダー(クラス宣言)も共有できますか?また、クラスまたは一部のライブラリの 'CreateCylinder'ですか? MFCクラスには 'C'プレフィックスがあるので、それは' CCreateCylinder'でなければなりません。 –

+0

私は自分の投稿にヘッダファイルのコードを追加しました。そして、はい、CreateCylinderはクラスです、それは正しく(CCreateCylinderDlg)の名前を付けないのは間違いでした。その変更に関連するエラーの数を心配することなく、(Visual Studioで)ウィザードで名前を変更することは可能ですか? – serg90

+0

コードに「ウィザードのマーキング」が表示されない場合は、ウィザードを使用してクラスの名前を変更できるはずです。 –

答えて

0

ここでの問題はenumシンボルIDD_CREATE_CUBE_DLGの範囲です。あなたがクラスを継承するとき、あなたはそれを継承しません "シンボルの範囲"、あなたは単に "メンバの名前空間"を継承します。私はいくつかの言語弁護士がより正確な(技術的に正しい)説明を与えることができると確信しています。しかし、簡単な説明は、あなたがシンボルを受け継いでいないということです - それで列挙型 - 定義。ただし、保護されたスコープ内にあってもアクセスできます。

ので、その後、IDD_CREATE_CUBE_DLGが "その" IDDを設定するCreateCylinderクラスで使用されていると仮定して、代わりに:

enum { IDD = IDD_CREATE_CUBE_DLG }; 

あなたが書く必要があります。

enum { IDD = CreateCylinder::IDD }; 

私は正しい言葉遣いと思いますここでは「完全修飾」の名前が必要だと言います。

これは実際には良いことですが、クラスによってサポートされているメッセージを列挙するなど、トリックを再生するクラスライブラリもあります(たとえばFOX(ウィジェット)ツールキットライブラリを参照してください)。

UPDATE: ようIDD_CREATE_CUBE_DLGの使用を避け、ここで更新されるよう、あなたの宣言を変更した場合、それはあなたがこれ以上IDD_CREATE_CUBE_DLGに問題を持っていない可能性が高いです。しかし、それでも問題がある場合は、Resource.hで宣言されているため、エラーが報告された行であるResource.hと宣言されているため、Resource.hは(適切に)含まれていませんでした。したがって、エラーが報告されたときにコンパイルされるファイル.cppを確認してください。次に、そのファイルのインクルードをチェックします。あなたはそれらをきれいにする必要がありますが、まず、.hファイルの先頭にある "#include "Resource.h""だけです。 CDialogExのコンストラクタとして

、ちょうどこのように、に沿ってパラメータを渡す:実際私のベースダイアログヘッダにRESOURCE.Hを添加

CreateCylinder::CreateCylinder(CWnd* pParent) 
: CDialogEx(CreateCylinder::IDD, pParent) 
+0

IDD_CREATE_CUBE_DLGシンボルは、実際にはCreateCylinderクラスではなく、Resource.hファイルで宣言されているので、あなたが言ったように使用することはできません。 そして、何とかコンパイラがBaseWinDlgのシンボルについて私にエラーを表示します。これは、私のメインダイアログで、他のダイアログを開くことができます。 さらに、 "this-> GetSafeOwner()"を継承したダイアログに必要な基本クラスのコンストラクタに送信していますか、それとも間違っていますか?私は親の議論について何かをしなければならない時はいつか分かりません。 – serg90

+0

'#include 'を '#include" Resource.h "と' .cpp'を '.h'に変更しました – sergiol

0

は、問題を解決しました。継承されたクラスを追加する前に、どうやって完璧に動作したのか分かりません。どちらの場合も、このヘッダーファイルは含まれていなかったので、どのように最初の場所で動作しましたか?

+0

" Resource.h "が間接的に含まれている可能性がありますか? – sergiol

+0

Resource.hにVS行 '// {{NO_DEPENDENCIES}}'が含まれているかどうかを確認します。更新されたID(たとえば)によって変更されたときに再コンパイルされません。これは、1つの微調整がリソースに依存するため、すべてが再コンパイルされないようにするためです。通常は、その1つのリソースの調整に依存しているONEモジュールの再コンパイルを強制することができます。 – franji1

関連する問題