2017-10-07 535 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