错误:类尚未声明?! C ++ wxwidgets

时间:2014-03-28 06:22:51

标签: c++ user-interface compiler-errors include wxwidgets

所以我只花了大约4个小时的时间来修复这个错误,但我不能。它在C ++中的wxw应用程序。

我有一个app类,我声明了我的主窗口。然后,我在第一个窗口类中声明我的第二个窗口。我想在我的第二个窗口类中引用第一个窗口的类。我只是不断收到这个错误。

  

E:\工作空间\码块\ Studentonator \ AddMarkOne.h | 35 |错误:   'StudentonatorDialog'尚未声明|

我的App类头文件:

#ifndef STUDENTONATORAPP_H
#define STUDENTONATORAPP_H

#include <wx/app.h>
#include <wx/dialog.h>
#include <AddMarkOne.h>
#include <StudentonatorMain.h>

class StudentonatorApp : public wxApp
{
    public:
        virtual bool OnInit();
};

#endif // STUDENTONATORAPP_H

我的主要wxDialog头文件:

#ifndef STUDENTONATORMAIN_H
#define STUDENTONATORMAIN_H

#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

#include "AddMarkOne.h"
#include "StudentonatorApp.h"
#include "student.h"


#include <wx/button.h>
#include <wx/statline.h>
#include <wx/grid.h>
#include <list>
#include <iostream>
#include <fstream>
using namespace std;

class StudentonatorDialog: public wxDialog
{
    public:
        StudentonatorDialog(wxDialog *dlg, const wxString& title);
        void refresh();
        ~StudentonatorDialog();
        int ID_counter = 0;
        list<student*> GetList(){return StudentList;};
    protected:
        enum
        {
            idBtnAbout,
            idBtnAddStudent,
            idBtnRemoveStudent,
            idBtnEditStudent,
            idBtnAddMark
        };
        wxStaticText* m_staticText1;
        ...
        list<student*> StudentList;
        AddMarkOne* dlgaddmark1;

    private:
        void OnClose(wxCloseEvent& event);
        ...
        int numstrlevelcounter=0;
};

#endif // STUDENTONATORMAIN_H

继承我的第二个wxDialog课程:

#ifndef ADDMARKONE_H
#define ADDMARKONE_H

#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

#include <wx/dialog.h>
#include <wx/button.h>
#include <wx/statline.h>
#include <wx/grid.h>
#include <list>
#include <iostream>
#include <fstream>

#include "StudentonatorMain.h"
#include "student.h"
#include "StudentonatorApp.h"


using namespace std;

class AddMarkOne: public wxDialog
{
    public:
        AddMarkOne(wxDialog* dlg1, const wxString& title, StudentonatorDialog* maindialog);
        ~AddMarkOne();
        int ID_counter = 0;
        void SetID(int ID){this->ID = ID;}


    protected:
        enum
        {
            idBtnNext,
        };
        wxStaticText* m_staticText1;
        wxStaticLine* m_staticline1;
        wxButton* BtnNext;


    private:
        void OnClose(wxCloseEvent& event);
        int i;
        int j;
        DECLARE_EVENT_TABLE()
        int ID;

};

#endif // ADDMARKONE_H

请帮助:)

3 个答案:

答案 0 :(得分:0)

由于我对C++的了解,你无法在类声明(如Java语言)中为类成员赋值,所以应该在构造函数中执行此操作

int ID_counter = 0;

 int numstrlevelcounter=0;

<强>更新
您已宣布课程AddMarkOne,其引用StudentonatorDialog并声明引用StudentonatorDialog的课程AddMarkOne。看来这里有一个循环。并且通过此循环,您无法解决此问题。我的建议是改进你的主要架构,继承和多态

您的#include语句必须具有以下格式:
1.首先是更抽象的类include语句然后继承类include语句
2.在更抽象的类中,你不应该引用继承的类 3.你的继承链必须是一个像树一样的东西(没有任何循环)作为你的包含语句

答案 1 :(得分:0)

正如其他人所说,你的问题可能是由于递归地包括所有方向的标题。虽然在这个具体的例子中可以通过删除不必要的包含来避免这种情况,但通常在C ++中更好的想法是使用前向声明:只要你只使用指针或对类的引用声明方法并避免不必要的编译它们就足够了依赖性(即,如果"AddMarkOne.h"发生变化,即使它完全不需要,也会需要重新编译包括"StudenatorMain.h"在内的所有代码。

所以而不是 #include "StudentonatorMain.h"只需使用转发声明class StudentonatorDialog;

答案 2 :(得分:0)

您的解决方案中的问题是头文件在编译之前已经过预处理,并且您在其中声明未编译,因此您必须使 Studentonatormain.h 文件必须被编译,因此请更改扩展名 .h .cpp 并重新编译它将克服错误