2013-08-27 2 views
0

У меня возникли проблемы с инициализацией классов, и все результаты, которые мои поисковые находки представляют собой различные другие проблемы.Инициализация класса - неразрешенный внешний символ

Я пытаюсь инициализировать класс с InkSpot *ink; в файле заголовка, тогда, когда класс должен инициализировать, я делаю это с ink = new InkSpot(this); < - эта строка вызывает ошибку.

inkpuppet.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl InkSpot::InkSpot(class QWidget *)" ([email protected]@[email protected]@@@Z) referenced in function "private: void __cdecl InkPuppet::testButton(void)" ([email protected]@@AEAAXXZ)

Я новичок в C++ и у меня возникают проблемы решения классов. Вот мой код.

inkpuppet.cpp

#include "inkpuppet.h" 
#include "ui_inkpuppet.h" 
#include "newdialog.h" 
#include "inkspot.h" 

#include <Qt> 
#include <QtCore> 
#include <QtGui> 
#include <QtWidgets> 
#include <QDialog> 
#include <QMainWindow> 


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

    //connect the frame range boxes to the timeslider 
    connect(ui->lowerFrameBox, SIGNAL(valueChanged(int)), this, SLOT(setMinimum(int))); 
    connect(ui->upperFrameBox, SIGNAL(valueChanged(int)), this, SLOT(setMaximum(int))); 

    //connect the menu items 
    connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(actionNew())); 

    //connect test 
    connect(ui->testButton, SIGNAL(clicked()), this, SLOT(testButton())); 


} 

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

void InkPuppet::setMinimum(int value) 
{ 
    ui->timeSlider->setMinimum(value); 
} 

void InkPuppet::setMaximum(int value) 
{ 
    ui->timeSlider->setMaximum(value); 
} 

void InkPuppet::actionNew() 
{ 
    NewDialog *dialog = new NewDialog; 
    dialog->setModal(true); 
    dialog->show(); 
} 

void InkPuppet::testButton() 
{ 
    ink = new InkSpot(this); 
    ui->testButton->setText("working"); 
    //ui->paintAreaLayout->addWidget(ink->widget); 
    //QWidget *widg = new QWidget(); 
    ui->paintAreaLayout->addWidget(ink->widget); 

} 

inkpuppet.h

#ifndef INKPUPPET_H 
#define INKPUPPET_H 

#include "inkspot.h" 
#include "ink.h" 

#include <QMainWindow> 
#include <QWidget> 

namespace Ui { 
class InkPuppet; 
} 

class InkPuppet : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit InkPuppet(QWidget *parent = 0); 
    ~InkPuppet(); 
    InkSpot *ink; 

private slots: 
    void setMinimum(int value); 
    void setMaximum(int value); 
    void actionNew(); 
    void testButton(); 

public: 
    Ui::InkPuppet *ui; 
}; 

#endif // INKPUPPET_H 

inkspot.cpp

#include "inkspot.h" 
#include "inkpuppet.h" 
#include "ui_inkpuppet.h" 

#include <QtCore> 
#include <QtGui> 
#include <QWidget> 
#include <QPainter> 
#include <QPaintEvent> 


void InkSpot::paintEvent(QPaintEvent *event) 
{ 
    QFile *brushInput; //takes raw 8 bit grayscale image, 8 bit values only 
    char *brushProto; 
    uchar *brushData; 

    brushInput = new QFile("x:\\Development\\InkPuppet\\brush.raw"); //open the raw file 
    brushInput->open(QIODevice::ReadOnly); 
    QDataStream in; 
    in.setDevice(brushInput); 
    int size = brushInput->size(); //set size to length of raw file 

    brushProto = new char[size]; 
    in.readRawData(brushProto, size); //read file into prototype 
    brushData = new uchar[size]; 

    for(int i = 0; i < size; ++i) 
    { 
     brushData[i] = (uchar)brushProto[i]; //copy char to uchar array 
    } 

    QImage test(brushData, 128, 128, QImage::Format_Indexed8); 
    QImage test2(128, 128, QImage::Format_ARGB32); 

    QVector<QRgb> vectorColors(256); //create color table 
    for(int c = 0; c < 256; c++) 
    { 
     vectorColors[c] = qRgb(c, c, c); 
    } 

    test.setColorTable(vectorColors); 

    for(int iX = 0; iX < 100; ++iX) 
    { 
     for(int iY = 0; iY < 100; ++iY) 
     { 
      test2.setPixel(iX, iY, qRgba(255 - (qrand() % 100), 0 + (qrand() % 100), 0 + (qrand() % 100), qAbs((int)test.pixel(iX, iY)-255))); 
     } 
    } 

    //final conversion for stencil and color brush 
    QPixmap testPixmap = QPixmap::fromImage(test2); 
    QPixmap testPixmap2 = QPixmap::fromImage(test); 

    QPainter painter(this); 

    painter.drawPixmap(150, 50, 100, 100, testPixmap); 
    painter.drawPixmap(50, 50, 100, 100, testPixmap2); 

    delete[] brushProto; 
    delete[] brushData; 
    delete brushInput; 
} 

inkspot.h

#ifndef INKSPOT_H 
#define INKSPOT_H 

#include <QObject> 
#include <QWidget> 
#include <QPainter> 
#include <QPaintEvent> 
#include <QLabel> 

namespace Ui { 
class InkSpot; 
} 

class InkSpot : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit InkSpot(QWidget *parent = 0); 
    ~InkSpot(); 
    void draw(QPainter *painter); 
    QWidget *widget; 
    QLabel *label; 
signals: 

public slots: 

protected: 
    void paintEvent(QPaintEvent *event); 

private: 
    Ui::InkSpot *ui; 

}; 

#endif // INKSPOT_H 
+1

Похоже, что вам не хватает определения для явного InkSpot (QWidget * parent = 0); ' – juanchopanza

+0

Нам будет легче помочь вам найти проблему, если вы удалите код, который не помогает в воспроизведении ошибка. например, вы, вероятно, могли бы удалить весь этот установочный код слота. Удаляйте как можно больше, сохраняя при этом исходную ошибку. – Elliott

ответ

3

Я просматриваю весь код, который вы опубликовали, для определения InkSpot::InkSpot(QWidget *parent), и я не вижу его. Сообщение об ошибке сообщает вам, что вы его не определили. Поэтому я думаю, что это должна быть проблема.

Это не достаточно, чтобы поставить декларацию для чего-то в заголовочном файле, где вы должны также определить его. Вы сделали это с InkPuppet::InkPuppet(QWidget *parent), поэтому вам просто нужно сделать то же самое с InkSpot::InkSpot(QWidget *parent).

+0

Похожая ошибка: 'inkspot.obj: -1: ошибка: LNK2019: неразрешенный внешний символ" public: virtual __cdecl InkSpot :: ~ InkSpot (void) "(? 1InkSpot @@ UEAA @ XZ), на который ссылается функция" public: virtual void * __cdecl InkSpot :: скалярный удаление деструктора '(unsigned int) "(?? _GInkSpot @@ UEAAPEAXI @ Z)' – Vii

+1

ОК, теперь ошибка говорит вам, что вы не определили деструктор, так что сделайте это или удалите объявление деструктора из заголовка. У вас была веская причина иметь деструктора? Если нет, то избавитесь от него. – john

+0

@ user1090427 вы можете увидеть здесь рисунок. – juanchopanza

Смежные вопросы