Anfänger-Problem: Klassenaufruf?

Alles rund um die Programmierung mit Qt
Antworten
SinCosTan
Beiträge: 3
Registriert: 30. November 2007 17:21

Anfänger-Problem: Klassenaufruf?

Beitrag von SinCosTan »

Hi,
seit ein paar Tagen beschäftige ich mich mit C++ und Qt.
Hab aber leider schon bei einer elementaren Aufgabe Schwierigkeiten ,-)

Ich poste einfach mal den Code:

main.cpp

Code: Alles auswählen

#include "myApp.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	
	FileHandler *file = new FileHandler;
	file->setText();
    
    QPushButton *button = new QPushButton("quit");
    QObject::connect(button, SIGNAL(clicked()), qApp, SLOT(quit()));
    button->show();
    
	return app.exec();
}

myApp.h

Code: Alles auswählen

#ifndef MYAPP_H
#define MYAPP_H

#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QPushButton>

class FileHandler;

class FileHandler : public QWidget
{
      public:
             FileHandler(QWidget *parent = 0);
             void setText();
             
      private:
              QFile datei;
             
};

#endif

filehandler.cpp

Code: Alles auswählen

#include "myApp.h"


FileHandler::FileHandler(QWidget *parent)
     : QWidget(parent)
{
   QFile *datei = new QFile("save.txt");

   datei->open(QIODevice::ReadWrite);

         
}

void FileHandler::setText()
{
         const char* msg = "hi";
	 datei.write(msg, qstrlen(msg));
	 datei.close();
}

Damit will ich ganz einfach einen Text in eine txt-Datei schreiben. Das Problem liegt irgendwo am Aufruf von FileHandler::setText(). Ich denk da hab ich irgendwo einen Fehler eingebaut (compilieren + ausführen funktioniert problemlos, aber es wird kein Text in die Datei geschrieben).
Wenn ich gleich im Konstruktor in die Datei schreibe, funktionierts, daher mein Verdacht auf _irgendeinen_ Fehler in/um setText().

Hoffe da kann mir jemand helfen. Vielen Dank schonmal,
sct
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Mach mal im Konstruktor aus dem

Code: Alles auswählen

QFile *datei = new QFile("save.txt"); 
ein

Code: Alles auswählen

datei = new QFile("save.txt"); 
Kurz zur Erklärung:
"datei" ist bei dir global in der Klasse definiert (siehe dein myapp.h).
Im Konstruktor definierst du aber noch einmal ein Objekt mit dem Namen "datei". Das gibt soweit keine Probleme wegen dem Name. Im Konstruktor wird allerdings auf das lokale Objekt zugegriffen, in der SetText Methode jedoch auf das klassen-globale Objekt!

EDIT: Mach am besten noch in der .h datei ein

Code: Alles auswählen

QFile *datei
daraus und dann in der SetText Methode den Punkt eben durch ein -> ersetzen. Hab ich jetzt grad auf die Schnelle überlesen.
Zuletzt geändert von iaby am 30. November 2007 23:29, insgesamt 1-mal geändert.
VuuRWerK
Beiträge: 82
Registriert: 11. Juni 2007 20:46
Wohnort: Dresden

Beitrag von VuuRWerK »

Deine im KOnstruktor definierte Variable datei ist nach abschließen des Konstruktors auch wieder weg, somit wirst Du darauf nicht innerhalb einer Methode zugreifen können, es sei denn es handelst sich dabei um eine MemberVariable oder um eine globale Variable.

Folgendes sollte gehen:

Code: Alles auswählen

#ifndef MYAPP_H
#define MYAPP_H

#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QPushButton>

class FileHandler;

class FileHandler : public QWidget
{
      public:
             FileHandler(QWidget *parent = 0);
             void setText();
             
      private:
              QFile *datei;// Wenn Du schon mit new initialisierst sollte es auch ein Zeiger sein der auf QFile zeigt
             
};

#endif 

Code: Alles auswählen

#include "myApp.h"


FileHandler::FileHandler(QWidget *parent)
     : QWidget(parent)
{
   datei = new QFile("save.txt");// greift auf die Membervariable zu

   datei->open(QIODevice::ReadWrite);

         
}

void FileHandler::setText()
{
         const char* msg = "hi";
    datei.write(msg, qstrlen(msg));
    datei.close();
} 
Gut Schuß
VuuRWerK ;)
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Oft ist die Ursache des schwarzsehens lediglich ein verrutschen des Bretts vorm Kopf =)
SinCosTan
Beiträge: 3
Registriert: 30. November 2007 17:21

Beitrag von SinCosTan »

Vielen Dank für die schnelle Hilfe, jetzt klappts :D

so far,
sct
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Du solltest noch einen Destruktor anlegen, der mit

Code: Alles auswählen

delete datei;
den reservierten Speicherplatz auch wieder freigibt!!!
SinCosTan
Beiträge: 3
Registriert: 30. November 2007 17:21

Beitrag von SinCosTan »

Alles klar, Destruktor ist auch eingebaut. Habs jetzt auch hingekriegt setText als SLOT einzurichten.

Danke, bei Problemen meld ich mich wieder. :lol:
sct[/code]
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag von RD1978 »

Hallo,

@iaby
Du solltest noch einen Destruktor anlegen, der mit
delete datei;
den reservierten Speicherplatz auch wieder freigibt!!!
Objekte die von QObject erben sollten grundsätzlich mit der Methode deleteLater() freigegeben werden und nicht mit delete. Dadurch übernimmt Qt die Freigabe und es wird sichergestellt das das Objekt seine Arbeit auch wirklich beendet hat und nicht zu früh gelöscht wird.

@SinCosTan
Du kannst auch im Konstruktor von QFile this mit übergeben, dann übernimmt das Widget das Löschen.
datei = new QFile("save.txt", this);

MfG RD1978
Antworten