如何解决Qt中的多重定义?
我不知道为什么我会遇到这个问题,头文件只包含一次,但它连续显示错误,我也已经检查过.pro文件,每个SOURCE只包含一次。我该如何解决这个问题? 我会附上我使用的文件及其包括和小家伙们的代码如何解决Qt中的多重定义?
globals.h
#ifndef GLOBALS_H
#define GLOBALS_H
#include <QtGlobal>
#include "structs.h"
QT_BEGIN_NAMESPACE
struct ListaPaquetes;
QT_END_NAMESPACE
extern ListaPaquetes *nuevoPaquete;
#endif // GLOBALS_H
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include <QDialog>
#include <QtCore>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_startButton_clicked();
void on_planificarProduButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
produccion.h(只第一行)
#ifndef PRODUCCION_H
#define PRODUCCION_H
#include <QDialog>
structs.h(onyl first lines) 这里是结构ListaPaquetes,这是一种负责任的错误,所以我想这个问题是这个文件,但我不知道为什么
#ifndef STRUCT_H
#define STRUCT_H
#include <QString>
#include <QList>
struct Nodo
{
int cantidad;
QString tipoPaquete;
Nodo *siguiente;
Nodo *anterior;
Nodo(){}
Nodo (int cant, QString paquete)
{
cantidad = cant;
tipoPaquete = paquete;
siguiente = nullptr;
anterior = nullptr;
}
};
struct ListaPaquetes
{
Nodo *pn;
ListaPaquetes()
{
pn = nullptr;
}
void crearPaquete(int,QString);
QList<QString> paquetesAgregados();
};
void ListaPaquetes::crearPaquete(int cant, QString paquete)
{
if (pn==nullptr)
{
pn = new Nodo(cant, paquete);
pn->siguiente = pn;
pn->anterior = pn;
}
else
{
Nodo *nuevo = new Nodo(cant, paquete);
pn->anterior->siguiente=nuevo;
nuevo->anterior = pn->anterior;
nuevo->siguiente=pn;
pn->anterior = nuevo;
}
}
QList<QString> ListaPaquetes::paquetesAgregados()
{
QList <QString> paquetes;
if (pn!=nullptr)
{
Nodo *tmp = pn;
do
{
paquetes.append(tmp->tipoPaquete);
tmp = tmp->siguiente;
}while(tmp!=pn);
}
return paquetes;
}
#endif // STRUCT_H
globals.cpp
#include "globals.h"
ListaPaquetes *nuevoPaquete = new ListaPaquetes();
为主。 CPP
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColor>
#include <QColormap>
#include <QtCore>
#include <QtGui>
#include <QMessageBox>
#include "produccion.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_startButton_clicked()
{
if(ui->cantGalletas->text() == "")
{
QMessageBox::warning(this,"Error","Debe introducir una cantidad de
galletas");
}
}
void MainWindow::on_planificarProduButton_clicked()
{
Produccion *ventanaPaquetes = new Produccion();
ventanaPaquetes->show();
}
produccion.cpp(当我要离开这儿的东西,它显示错误)
#include "produccion.h"
#include "ui_produccion.h"
#include <QtCore>
#include <QMessageBox>
#include "globals.h"
下面是错误:
,因为你是把执行你所得到的问题头文件中的成员函数(这里是structs.h)。每个源文件包括globals.h将包括structs.h并编译在那里实现的功能。当您链接您的程序这些功能的多重定义
你需要移动ListaPaquetes::crearPaquete(int cant, QString paquete)
和 ListaPaquetes::crearPaquete(int cant, QString paquete)
到structs.cpp
任何解决方案?因为仍然无法解决问题 –
我编辑了答案:将成员函数实现移入* structs.cpp * – PiedPiper
为什么你'#包括'和'的#include '?并不是说它有所作为,但这些都是一样的。你不会在问题中显示错误。哪个符号被定义了两次? –
nwp
我同意@nwp也是为什么你有两个包括:'#包括'&'#包括' –
aghilpro
@nwp我已添加一些代码和错误,希望你能帮助我。我也删除了''和'',没有任何变化。 –