2017-10-07 518 views
0

我不知道为什么我会遇到这个问题,头文件只包含一次,但它连续显示错误,我也已经检查过.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" 

下面是错误:

enter image description here

+2

为什么你'#包括'和'的#include '?并不是说它有所作为,但这些都是一样的。你不会在问题中显示错误。哪个符号被定义了两次? – nwp

+0

我同意@nwp也是为什么你有两个包括:'#包括'&'#包括' – aghilpro

+0

@nwp我已添加一些代码和错误,希望你能帮助我。我也删除了''和'',没有任何变化。 –

回答

0

,因为你是把执行你所得到的问题头文件中的成员函数(这里是structs.h)。每个源文件包括globals.h将包括structs.h并编译在那里实现的功能。当您链接您的程序这些功能的多重定义

你需要移动ListaPaquetes::crearPaquete(int cant, QString paquete)ListaPaquetes::crearPaquete(int cant, QString paquete)structs.cpp

+0

任何解决方案?因为仍然无法解决问题 –

+0

我编辑了答案:将成员函数实现移入* structs.cpp * – PiedPiper