2017-10-07 11 views
0

Je ne sais pas pourquoi j'ai eu ce problème, les fichiers d'en-tête sont juste inclus une fois mais il continue à montrer l'erreur, je vérifie déjà le fichier .pro et chaque SOURCE est juste inclus une fois. Comment puis-je resoudre ceci? Je joindre les fichiers que je utilise et leur inclusion et le code des petitsComment résoudre la définition multiple en 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 (seulement des premières lignes)

#ifndef PRODUCCION_H 
#define PRODUCCION_H 

#include <QDialog> 

structs.h (onyle premières lignes) Voici les ListaPaquetes struct, qui est le responsable de l'erreur, donc le problème que je suppose dans ce dossier, mais je ne sais pas pourquoi

#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(); 
principale

. 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 (Quand je lance quelque chose d'ici, il montre l'erreur)

#include "produccion.h" 
#include "ui_produccion.h" 
#include <QtCore> 
#include <QMessageBox> 
#include "globals.h" 

Voici les erreurs:

enter image description here

+2

Pourquoi avez-vous '#include ' et '' #include ? Pas que cela fasse une différence, mais ce sont la même chose. Vous ne montrez pas l'erreur dans la question. Quel symbole est défini deux fois? – nwp

+0

Je suis d'accord avec @ nwp aussi pourquoi vous avez deux inclure: '#include ' & '#include ' – aghilpro

+0

@nwp J'ai déjà ajouter du code et les erreurs, j'espère que vous pouvez m'aider. Aussi, j'élimine le «» et le «» et rien ne change. –

Répondre

0

Vous obtenez le problème parce que vous mettez la mise en œuvre des fonctions membres dans les fichiers d'en-tête (ici structs.h). Chaque fichier source qui comprend globals.h inclura structs.h et compilera les fonctions qui y sont implémentées. Lorsque vous liez votre programme ces fonctions sont définies se multiplient

Vous devez déplacer ListaPaquetes::crearPaquete(int cant, QString paquete) et ListaPaquetes::crearPaquete(int cant, QString paquete) dans structs.cpp

+0

Une solution?Parce que je ne peux toujours pas résoudre le problème –

+0

J'ai modifié la réponse: déplacez les implémentations de la fonction membre dans * structs.cpp * – PiedPiper