如何解决Qt中的多重定义?

时间:2017-10-07 06:18:14

标签: c++ qt include

我不知道为什么我遇到这个问题,头文件只包含一次,但它连续显示错误,我也检查了.pro文件,每个SOURCE只包含一次。我怎么解决这个问题? 我将附上我正在使用的文件及其包含和小家伙的代码

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

的main.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

1 个答案:

答案 0 :(得分:0)

您遇到了问题,因为您将成员函数的实现放在头文件中(此处为 structs.h )。包含 globals.h 的每个源文件都将包含 structs.h 并编译在那里实现的函数。链接程序时,这些函数是多重定义的

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