Hallo
Ich arbeite im Moment an einem Programm mit C++ und QT. (Zum Compilieren benutze ich das NMAKE kommando von qmake.)
Ich bekomme einen Linkerfehler den ich mir nicht erklären kann:
Picwidget.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall PictureData::~PictureData(void)" (1PictureData@@QAE@XZ)
Segmentierer.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise NMAKE : fatal error U1077: 'link' :Rueckgabe-Code '0x460'
Das Problem hängt irgendwie mit meinen Klassen "Picwidget" und "PictureData" zusammen. Wie unten in den Quelltextausschnitten dargestellt ist der Destruktor von "PictureData" den der Linker anmeckert sowohl in der Headerdatei "PictureData.h" definiert als auch in "PictureData.cxx" implementiert. Eine andere Klasse "PicWidget" hat als Attribut einen Zeiger auf eine Instanz von "PictureData" und muss diese in ihrem destruktor löschen. Was ich herausgefunden habe ist, daß der Fehler nicht auftritt wenn ich den "delete picDataPtr;" im Destruktor der Picwidget Klasse weglasse. Und genau das verstehe ich nicht.
Welches Problem hat der Linker mit dem Destruktor der Klasse "PictureData" wenn ich in einer anderen Klasse eine Instanz davon lösche ? Außedem kennt die PicWidget-Klasse doch über ihre Headerdatei auch die PictureData-Klasse und müsste beim delete-Befehl deren Destruktor aufrufen können. Was geht hier schief ?
Würde mich freuen wenn mir jemand damit helfen könnte. Details zum Quelltext:
Die Headerdatei "PictureData.h" sieht so aus:
#ifndef PICDATA_H
#define PICDATA_H
#include <qpicture.h>
class PictureData
{
private:
QImage* currentImage;
public:
PictureData();
~PictureData();
PictureData(QImage* initial);
void setImage(QImage* img);
QImage* getImage();
};
#endif
Die Implementierung des Destruktors in "PictureData.cxx":
PictureData::~PictureData()
{
if(!currentImage->isNull())
{
delete currentImage;
}
}
Die Headerdatei "Picwidget.h" sieht so aus:
#ifndef PICWIDGET_H
#define PICWIDGET_H
#include <qwidget.h>
#include "PictureData.h"
class PicWidget: public QWidget
{
Q_OBJECT
private:
PictureData* picDataPtr;
public:
PicWidget( QWidget *parent=0, const char *name=0 );
~PicWidget();
void setPicDataPtr(PictureData* picData);
PictureData* getPicDataPtr();
void drawContent();
public slots:
void loadFile();
};
#endif
Implementierung des Destruktors in "Picwidget.cxx":
PicWidget::~PicWidget()
{
if(picDataPtr)
{
delete picDataPtr; //warum Linkerfehler mit dieser Zeile?
picDataPtr = NULL;
}
}
Ich arbeite im Moment an einem Programm mit C++ und QT. (Zum Compilieren benutze ich das NMAKE kommando von qmake.)
Ich bekomme einen Linkerfehler den ich mir nicht erklären kann:
Picwidget.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall PictureData::~PictureData(void)" (1PictureData@@QAE@XZ)
Segmentierer.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise NMAKE : fatal error U1077: 'link' :Rueckgabe-Code '0x460'
Das Problem hängt irgendwie mit meinen Klassen "Picwidget" und "PictureData" zusammen. Wie unten in den Quelltextausschnitten dargestellt ist der Destruktor von "PictureData" den der Linker anmeckert sowohl in der Headerdatei "PictureData.h" definiert als auch in "PictureData.cxx" implementiert. Eine andere Klasse "PicWidget" hat als Attribut einen Zeiger auf eine Instanz von "PictureData" und muss diese in ihrem destruktor löschen. Was ich herausgefunden habe ist, daß der Fehler nicht auftritt wenn ich den "delete picDataPtr;" im Destruktor der Picwidget Klasse weglasse. Und genau das verstehe ich nicht.
Welches Problem hat der Linker mit dem Destruktor der Klasse "PictureData" wenn ich in einer anderen Klasse eine Instanz davon lösche ? Außedem kennt die PicWidget-Klasse doch über ihre Headerdatei auch die PictureData-Klasse und müsste beim delete-Befehl deren Destruktor aufrufen können. Was geht hier schief ?
Würde mich freuen wenn mir jemand damit helfen könnte. Details zum Quelltext:
Die Headerdatei "PictureData.h" sieht so aus:
#ifndef PICDATA_H
#define PICDATA_H
#include <qpicture.h>
class PictureData
{
private:
QImage* currentImage;
public:
PictureData();
~PictureData();
PictureData(QImage* initial);
void setImage(QImage* img);
QImage* getImage();
};
#endif
Die Implementierung des Destruktors in "PictureData.cxx":
PictureData::~PictureData()
{
if(!currentImage->isNull())
{
delete currentImage;
}
}
Die Headerdatei "Picwidget.h" sieht so aus:
#ifndef PICWIDGET_H
#define PICWIDGET_H
#include <qwidget.h>
#include "PictureData.h"
class PicWidget: public QWidget
{
Q_OBJECT
private:
PictureData* picDataPtr;
public:
PicWidget( QWidget *parent=0, const char *name=0 );
~PicWidget();
void setPicDataPtr(PictureData* picData);
PictureData* getPicDataPtr();
void drawContent();
public slots:
void loadFile();
};
#endif
Implementierung des Destruktors in "Picwidget.cxx":
PicWidget::~PicWidget()
{
if(picDataPtr)
{
delete picDataPtr; //warum Linkerfehler mit dieser Zeile?
picDataPtr = NULL;
}
}