"undefined class" 夸脱度/C++



我最近开始用C++编程,在类之间的数据交换方面遇到了一些困难。我搜索了许多教程和示例,但都不起作用。我最终决定寻求帮助,因为我不知道该做什么。。。

PS:我想从我的B(solEditor)类调用keyPressEvent函数

谢谢。

插件/soleditor.h(类)

#include <Qsci/qsciscintilla.h>
#include <QWidget>
#include <QKeyEvent>
class Editor; // main class
class solEditor : public QsciScintilla
{
public:
    explicit solEditor(QWidget *parent = 0);
    Editor editor; // error << 
protected:
    void keyPressEvent(QKeyEvent *e);
};

编辑器.h(主窗口)

#include <QMainWindow>
#include "about.h"
#include "data.h"
#include "addons/codeeditor.h"
#include "addons/highlighter.h"
#include "addons/soleditor.h"
#include "plugins/headergenerator.h"
#include "plugins/updatescreen.h"
namespace Ui {
class Editor;
}
class solEditor;
class Editor : public QMainWindow
{
    Q_OBJECT
solEditor *sE;
public:
    QsciScintilla* ce;
    Highlighter *Hl;
    solEditor *e;
    Ui::Editor *ui;
    explicit Editor(QWidget *parent = 0);
    ~Editor();
public slots:
    void on_KeyPress(QKeyEvent *e);
};

错误:

SOLEditor\addons\SOLEditor.h:14:错误:C2079:"SOLEditor::editor"使用未定义的类"editor"

您使用的是正向声明

class Editor; // main class

具有该类的本地实例

Editor editor; // error <<

不幸的是,这是不可能的,因为在这种情况下,编译器需要知道Editor类的全部细节。有两种可能的解决方案:

  1. 使成员成为指针:Editor* editor
  2. 使用#include而不是正向声明

如果你想让你的代码变得灵活,你可以这样做:

class solEditor : public QsciScintilla
{
public:
    explicit solEditor(Editor* editor, QWidget* parent = 0);
    inline Editor* editor() const { return _editor; }
private:
    Editor* _editor;
}

和在cpp文件中:

solEditor::solEditor(Editor* editor, QWidget* parent)
    // TODO: call parent constructor
{
    _editor = editor;
}
solEditor::~solEditor()
{
    _editor = NULL;
}

然后,您可以创建一个solEditor实例,如下所示:

QWidget* optionalParentWidget = GetParentWidgetFromSomewhere();
Editor* editor = GetEditorInstanceFromSomewhere(); // or create it yourself
solEditor* myEditor = new solEditor(editor, optionalParentWidget);

(作为一个侧节点,C++中的类通常以大写字母QWidget, Editor, SolEditor开头。这使得更容易发现某个东西是类、函数还是变量)。


关于按键事件:如果你想让一个类处理另一个类的某些事件,最好使用eventFilter机制:

http://qt-project.org/doc/qt-5/qobject.html#installEventFilter

最新更新