QTime Problem - Wer kann es nachvollziehen?

Alles rund um die Programmierung mit Qt
Antworten
pinktroll
Beiträge: 10
Registriert: 23. Oktober 2004 19:52
Wohnort: bei München
Kontaktdaten:

QTime Problem - Wer kann es nachvollziehen?

Beitrag von pinktroll »

Hallo,

wenn ich in meinem constructor

Code: Alles auswählen

 QTime* meinezeit;
meinezeit->setHMS(0,0,0);
einfüge, dann wird mein programm sauber kompiliert.
beim auführen stürzt es aber mit
Prozess abgebrochen
ab.
wenn ich stattdessen

Code: Alles auswählen

QTime meinezeit;
meinezeit.setHMS(0,0,0);
benutze, dann klappt alles.
soweit ich gelernt hab, benutze ich dann aber keinen Pointer auf QTime sondern direkt und verbrate Speicher...
Als Entwicklungsumgebung nutze ich KDevelop 3.1 unter Debian/GNU Sid.

danke!!
-----------------------------------------------------------------------------------
Beati pauperes spiritu
-----------------------------------------------------------------------------------
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

Das ist kein spezifischen QTime Problem.

Das Objekt, mit dem Du arbeiten möchtest, existiert noch nicht, mit anderen Worten, da wo Dein Zeiger hinzeigt, gibt es kein QTime Objekt (weswegen das Schreiben von Daten in diesen Bereich zu einer Access Violation führt). Du musst für Deinen Zeiger erst ein Objekt auf dem Heap erzeugen (am besten machst Du vor Deine Zeiger immer ein p, damit Du sie von den anderen Variablen unterscheiden kanst )

QTime *pMeineZeit = new QTime;
pMeineZeit->setHMS(0,0,0);

Wenn Du das Objekt in der Weise eingibst

QTime meineZeit
meineZeit.setHMS(0,0,0)

wird das Objekt automatisch (auf dem Stack) erzeugt, wenn der Bezugsrahmen Deines Construktors betreten wird.

Gruss Arne
pinktroll
Beiträge: 10
Registriert: 23. Oktober 2004 19:52
Wohnort: bei München
Kontaktdaten:

Beitrag von pinktroll »

Vielen Dank für die Erklärung Arne!
Nur zum Verständniss:
Wenn ich in meiner Klasse eine Variable (egal ob aus Qt oder aus c++)
habe, die ich bei der Erstellung vom Constructor gefüllt haben möchte, muss diese Variable auf dem Stack erzeugt werden. stimmt das so?

Gruß

Martin
-----------------------------------------------------------------------------------
Beati pauperes spiritu
-----------------------------------------------------------------------------------
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Konstruktor einer Klasse wird bei der Erstellung einer Instanz dieser Klasse aufgerufen. Es ist völlig unerheblich, ob dieser wunderbarer Vorgang auf dem Stack oder auf dem Heap stattfindet...

Meine Empfehlung - C++ lernen und zwar schnell und gründlich!
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

hallo pinktroll

Du musst Dir überlegen, was Du mit Deiner Variablen (bzw. Deinem QTime Objekt) machen willst. Wird das QTime Objekt nur innerhalb des Konstruktor benötigt, kannst Du es auf dem Stack erzeugen. Wird das QTime Objekt für die gesamte Lebenszeit Deines Objektes benötigt, solltest Du es als Member - Variable anlegen

class IrgendEinObjekt
{
QTime m_meineZeit;
}

Es ist dann sozusagen Bestandteil (Member) Deines Objektes.

Soll Dein QTime Objekt das andere Objekt überleben und ggf. von anderen Objekten genutzt werden, dann musst Du es mit new auf dem Heap erzeugen. Allerdings musst Du das QTime Objekt später mit delete wieder löschen und dafür sorgen, dass andere Objekte anschließend nicht noch versehentlich auf das Objekt zugreifen.

Diese Ausführungen sind allerdings ziemlich theoretisch, wahrscheinlich würde niemand ein so einfaches Objekt wie QTime auf dem Heap erzeugen, sondern es bei Bedarf einfach (sozusagen von Stack zu Stack) kopieren. Wenn Du Deine Variablen und Objekte auf dem Stack (also nicht mit new) erzeugst, bist Du in jedem Falle auf der sicheren Seite.

Aber lepsius hat Recht: zur Vertiefung sollstest Du Dich mit einem Buch über OO Programmierung in c++ und dort insbesondere mit Variablen und Zeigern auf Variablen beschäftigen.

Gruss Arne
Antworten