gpt4 book ai didi

c++ - 不完整类型和前向声明的无效使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:23 24 4
gpt4 key购买 nike

我试图解决这个问题,但我对前向声明的理解肯定存在一些误解。

我收到以下错误:

src/algorithm.cpp: In constructor ‘Algorithm::Algorithm(MainWindow*)’:
src/algorithm.cpp:22:20: error: invalid use of incomplete type ‘struct Ui::MainWindow’
src/mainwindow.h:23:10: error: forward declaration of ‘struct Ui::MainWindow’

我有这些文件(我省略了一些行和文件并只粘贴了相关代码):

算法.cpp

#include "algorithm.h"
#include "mainwindow.h"

Algorithm::Algorithm(MainWindow *mainWindow)
{
this->mainWindow = mainWindow;

QAction *action = new QAction(this);
action->setObjectName(QStringLiteral("action"));
action->setText(this->getName());

mainWindow->m_ui->menuAlgorithms->addAction(action);

mainWindow->connect(action, SIGNAL(triggered()), this, SLOT(this->start()));
}

算法.h

#ifndef ALGORITHM_H
#define ALGORITHM_H

#include <QObject>

#include "graphwidget.h"
#include "edge.h"
#include "vertex.h"

class MainWindow;

class Algorithm : public QObject
{
public:
MainWindow *mainWindow;

Algorithm(MainWindow *mainWindow);

void start();
virtual void solve();
virtual QString getDescription();
virtual QString getName();
};

主窗口.cpp

#include "mainwindow.h"
#include "algorithm.h"
#include "../ui/ui_mainwindow.h"
#include "vertex.h"
#include "edge.h"
#include "warning.h"

mode_type mode;

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
m_ui(new Ui::MainWindow)
{
gundirected = NULL;
gdirected = NULL;

m_ui->setupUi(this);
...

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QSignalMapper>
#include <QUndoView>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QKeyEvent>
#include <QGraphicsSceneMouseEvent>
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>

#include "graphwidget.h"

enum mode_type {NORMAL, VERTEX, EDGE}; // vyctovy typ pro urceni editoacniho modu
extern mode_type mode;

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

Ui::MainWindow *m_ui;
...

最佳答案

您的代码中的问题是您试图在您的 Algorithm 类中使用 MainWindow 类的 m_ui 成员,并且m_ui 的类型是 Ui::MainWindow,但是您的 Algorithm 类不知道这种类型。您可以通过在 algorithm.cpp 中包含 ui_mainwindow.h 来解决这个问题。

但这仍然是糟糕的设计。 m_ui 应该是 MainWindow 类的私有(private)成员。您不应该从其他类访问它。而是在您的 MainWindow 类中创建函数,让您可以做您想做的事。

例如,创建一个这样的公共(public)函数:

void MainWindow::addCustomAction(QAction *action)
{
m_ui->menuAlgorithms->addAction(action);
}

然后从您的 Algorithm 类中调用此函数:

Algorithm::Algorithm(MainWindow *mainWindow)
{
this->mainWindow = mainWindow;

QAction *action = new QAction(this);
action->setObjectName(QStringLiteral("action"));
action->setText(this->getName());

mainWindow->addCustomAction(action);

connect(action, SIGNAL(triggered()), this, SLOT(start()));
}

关于c++ - 不完整类型和前向声明的无效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23929179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com