Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > multiple definition...


Автор: htzg 24.3.2012, 23:09
Здравствуйте!
Написал класс. Но при его использовании выходит след. проблема:
user posted image

вот исходники:
Код

#ifndef ADDGRIDDIALOG_H
#define ADDGRIDDIALOG_H

#include <QDialog>

#include "grid.h"

namespace Ui {
    class AddGridDialog;
}

class AddGridDialog : public QDialog
{
    Q_OBJECT

public:
    explicit AddGridDialog(QWidget *parent = 0);
    ~AddGridDialog();

signals:
    void getGridSignal(Grid grid);

public slots:
    void createGrid();

private:
    Ui::AddGridDialog *ui;

    QList<QList<QPointF> > *points;
    Grid grid;
};

#endif // ADDGRIDDIALOG_H




Код

#include "addgriddialog.h"
#include "ui_addgriddialog.h"

AddGridDialog::AddGridDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::AddGridDialog)
{
    ui->setupUi(this);

    points = new QList<QList<QPointF> > ;

    connect(ui->buttonBox,SIGNAL(accepted()),
            this,SLOT(createGrid()));
}

AddGridDialog::~AddGridDialog()
{
    delete ui;
}


void AddGridDialog::createGrid()
{


    grid.name = ui->gridNameLineEdit->text();
    grid.dx = ui->dx->text().toInt();
    grid.dy = ui->dy->text().toInt();
    grid.dz = ui->dz->text().toInt();





    qreal  x=0.0,
           y=0.0;

    for(int j=-1;   j < grid.dy   ;++j)
    {
        QList<QPointF> temp;
        for(int i=-1;   i < grid.dx   ;++i)
            temp.append(  QPointF(x+=100.0,y+=100.0)  );
        points->append(temp);
    }

    grid.points = points;

    emit getGridSignal(grid);

}



собственно в чем проблема? 
Спасибо!

Автор: boostcoder 25.3.2012, 00:17
Цитата(htzg @  24.3.2012,  23:09 Найти цитируемый пост)
namespace Ui {
    class AddGridDialog;
}

раз уж форвард ты впихнул в неймспейс, то почему декларация/реализация не в неймспейсе? ;)

Автор: htzg 25.3.2012, 11:08
дело в том что этот каласс Creator создал.
Я только внутри самого класса изменения внес.
Может дело во том что MainWindow (так же созданный Creatorом) в том же пространстве?
Код

namespace Ui {
    class MainWindow;
}

Автор: boostcoder 25.3.2012, 11:26
Цитата(htzg @  25.3.2012,  11:08 Найти цитируемый пост)
этот каласс Creator создал

мне, все же виднее, где должна быть реализация ;)

Автор: htzg 25.3.2012, 11:44
Цитата(boostcoder @  25.3.2012,  11:26 Найти цитируемый пост)
мне, все же виднее, где должна быть реализация ;)

можно показать как должно быть?(на моем коде)  smile 

Автор: math64 25.3.2012, 12:24
Qt Creator сделал всё правильно - класс AddGridDialog в файлах addgriddialog.h,  addgriddialog.cpp и Ui::AddGridDialog в файле ui_addgriddialog.h
Возможно, ошибка в файле проекта (два раза добавлены одни и те же файлы) или нужно заново перегенерить Makefile.Debug

Автор: boostcoder 25.3.2012, 12:30
Цитата(math64 @  25.3.2012,  12:24 Найти цитируемый пост)
класс AddGridDialog в файлах addgriddialog.h,  addgriddialog.cpp и Ui::AddGridDialog в файле ui_addgriddialog.h

не очень понял...
покажи как это выглядит в реализации.

Автор: htzg 25.3.2012, 12:32
Цитата(math64 @  25.3.2012,  12:24 Найти цитируемый пост)
Qt Creator сделал всё правильно - класс AddGridDialog в файлах addgriddialog.h,  addgriddialog.cpp и Ui::AddGridDialog в файле ui_addgriddialog.h
Возможно, ошибка в файле проекта (два раза добавлены одни и те же файлы) или нужно заново перегенерить Makefile.Debug 


до этого я баловался - создавал несколько раз AddGridDialog. Новые фалы он записывал на старые. 
Как перегенерить  Makefile.Debug? 

Автор: math64 25.3.2012, 17:02
Цитата(htzg @  25.3.2012,  12:32 Найти цитируемый пост)
до этого я баловался - создавал несколько раз AddGridDialog. Новые фалы он записывал на старые. 
Как перегенерить  Makefile.Debug?  

Проверь файл OperationPv1.pro - нет ли там повторений.
Код

SOURCES += \
  addgriddialog.cpp \
  array.cpp \
  ...
HEADERS += \
  addgriddialog.h \
  array.h \
  ...
FORMS += \
  addgriddialog.ui \
  mainwindow.ui

Дря перегенерации Makefile - удалить старые или
Сборка -> очистить всё, пересобрать всё 

Цитата(boostcoder @  25.3.2012,  12:30 Найти цитируемый пост)
покажи как это выглядит в реализации.

Как было показано в первом посте.
Генерируется только конструктор (вызывает ui->setupUi(this); ) и деструктор (вызывает delete ui; ), остальное добавлено вручную.
Если слот назвать buttonBox_accepted() то connect() будет не нужен, такой слот (пустой) тоже может быть сгенрирован автоматически.
Файл ui_*.h генерируется с помощью uic из *.ui и не должен редактироваться.

Автор: htzg 25.3.2012, 18:37
Цитата(math64 @  25.3.2012,  17:02 Найти цитируемый пост)
Проверь файл OperationPv1.pro - нет ли там повторений.

Код


QT       += core gui

TARGET = OperationEPv1
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    grid.cpp \
    array.cpp \
    point.cpp \
#    addgriddialog.cpp \
    addgriddialog.cpp

HEADERS  += mainwindow.h \
    myConst.h \
    grid.h \
    array.h \
    point.h \
#    addgriddialog.h \
    addgriddialog.h

FORMS    += mainwindow.ui \
#    addgriddialog.ui \
#    addgriddialog.ui \
    addgriddialog.ui


я закоментил повторения эти ошибки пропали.
Правда при сборки след ошибка:
user posted image

она связана с AddGridDialog?
Если нет то тема закрыта.

Автор: math64 26.3.2012, 08:06
Можешь не комментировать, а просто удалить.
Новая ошибка со старой не связана. Посмотри по стеку на последнюю строку из твоих исходинков. Ставь точки останова и т.д.

Автор: htzg 26.3.2012, 19:04
с ошибкой уже начал разбираться!
Спасибо большое всем! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)