Niunzin
Niunzin

Reputation: 45

"undefined class" Qt/C++

I recently started programming in C ++ and am having some difficulties in relation to the exchange of data between classes. I searched many tutorials and examples, but none worked. I finally decided to ask for help because I do not know what do ...

PS: I want to call keyPressEvent function from my B (solEditor) class

thanks.

addons/soleditor.h (class)

#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);

};

editor.h (main window)

#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);

};

Error:

SOLEditor\addons\soleditor.h:14: error: C2079: 'solEditor::editor' uses undefined class 'Editor'

Upvotes: 1

Views: 1490

Answers (1)

Tim Meyer
Tim Meyer

Reputation: 12600

You are using a forward declaration

class Editor; // main class

with a local instance of that class

Editor editor; // error <<

Unfortunately, that is not possible, as in this case the compiler needs to know the full details of the Editor class. There are two possible solutions:

  1. Make the member a pointer: Editor* editor
  2. Use an #include instead of a forward declaration.

If you want to make your code flexible, you could do it like this:

class solEditor : public QsciScintilla
{

public:
    explicit solEditor(Editor* editor, QWidget* parent = 0);

    inline Editor* editor() const { return _editor; }

private:
    Editor* _editor;
}

and in the cpp file:

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

solEditor::~solEditor()
{
    _editor = NULL;
}

You can then create a solEditor instance like this:

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

solEditor* myEditor = new solEditor(editor, optionalParentWidget);

(As a side node, classes in C++ usually start with a capital letter: QWidget, Editor, SolEditor. That makes it easier to spot if something is a class, a function or a variable).


About the key press event: If you want one class to handle certain events of another class, it's best to use the eventFilter mechanism:

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

Upvotes: 1

Related Questions