ошибка необъявленного идентификатора с правильным включением и объявлением - PullRequest
0 голосов
/ 18 ноября 2011

Я создаю приложение в Qt я получаю ошибку компиляции: ошибка C2065: 'callDialog': необъявленный идентификатор в моем классе CategoryDialog строка ошибки:

CallDialog* callDialog = ((CallDialog*)dialogStack->widget(1));

5-я последняя строка в классе CategoryDialog:

    #include "ui_categorydialog_new.h"
    #include "calldialog.h"
    #include "questionsdialog.h"
    #include "../objects/call.h"
    #include "../webservice/dataconnector.h"
    #include "../webservice/dataconngetter.h"

    namespace Ui {
        class CategoryDialog;
    }

    class CategoryDialog : public QDialog
    {
        Q_OBJECT

    public:
        explicit CategoryDialog(QWidget *parent = 0) : QDialog(parent), ui(new Ui::CategoryDialog){
            ui->setupUi(this);
        }

        ~CategoryDialog()
        {
            delete ui;
        }

    private slots:
        void on_btn_back_clicked()
        {
            ui->btn_back->setEnabled(false);
            DataConnGetter::getConnector()->setCallAbort(call->getId()); //get errormessage back and show errormessage when nessesary
            QStackedWidget* dialogStack = (QStackedWidget*)this->parentWidget();
            CallDialog* callDialog = ((CallDialog*)dialogStack->widget(1)); //TODO 005 replace indexes with enums > more clear
            callDialog->updateCalls(false);
            dialogStack->setCurrentIndex(1);
            ui->btn_back->setEnabled(true);
        }

класс CallDialog выглядит следующим образом

    #include <QDialog>
    #include <QString>
    #include <QList>
    #include <QSound>
    #include <QtDebug>
    #include <QStringList>
    #include <QPushButton>
    #include <QStackedWidget>
    #include <QtAlgorithms>
    #include <QLabel>
    #include <typeinfo>

    #include "ui_calldialog.h"
    #include "callbutton.h"
    #include "categorydialog_new.h"
    #include "../settings/consts.h"
    #include "../webservice/dataconnector.h"
    #include "../webservice/dataconngetter.h"
    #include "../settings/programsettings.h"
    #include "../webservice/pollingservice.h"

    class PollingService;

    namespace Ui {
        class CallDialog;
    }

    class CallDialog : public QDialog
    {
        Q_OBJECT

    public:
        //    explicit CallDialog(QWidget *parent = 0);
        //    ~CallDialog();
        //    void initCalls();
        //    void updateCalls(bool sound);
        //    void enablePoller();

        explicit CallDialog(QWidget *parent = 0) : QDialog(parent), ui(new Ui::CallDialog)
        {
            ui->setupUi(this);
            installEventFilter(this);

обратите внимание на правильное включение в CategoryDialog

они включают друг друга (может быть, проблема циклической зависимости?) Я пробовал с объявлением пересылки CallDialog. не помогло.

это только файлы .h с реализацией прямо внутри

EDIT

Я обошел проблему следующим образом: я добавил абстрактный класс с функцией, которую CallDialog использовал из CategoryDialog

вот так:

#ifndef ABSTRACTDIALOG_H
#define ABSTRACTDIALOG_H

#include <QDialog>

#include "../objects/call.h"

class AbstractDialog : public QDialog
{
    Q_OBJECT

public:
    explicit AbstractDialog(QWidget *parent = 0) : QDialog(parent){}
    void setCall(Call* call){
        _call = call;
    }
private:
    Call* _call;

};

#endif // ABSTRACTDIALOG_H

1 Ответ

0 голосов
/ 18 ноября 2011

Форвард CallDialog до CategoryDialog не будет работать, так как CallDialog функции-члены используются, и компилятор должен знать о них.

Вы пробовали объявить CategoryDialog вперед до CallDialog и удалить, я думаю, #include "categorydialog_new.h"? Поскольку все calldialog.h не отображается, я не уверен, как вы используете CategoryDialog в этом файле.

...