QString in eigenen Klassen

Alles rund um die Programmierung mit Qt
Antworten
Jazzi
Beiträge: 3
Registriert: 23. August 2006 17:36

QString in eigenen Klassen

Beitrag von Jazzi »

Hallo!

Wie kann ich Funktionen wie QString und QMap in eigenen Klassen verwenden? Includen der jeweiligen Header bringt nichts. Habe dann versucht von QObject abzuleiten, allerdings auch ohne Erfolg, wahrscheinlich aufgrund eines schweren Ausnahmefehlers meinerseits :-)

2. Frage: Ist es möglich das hässliche "Non-Commercial" im Titel rauszubekommen, wenn ja wie und ist das überhaupt erlaubt, selbst wenn ich den Bestimmungen entsprechend meine src. mitgebe?

Danke im Voraus!
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Öhm, also erstmal der Reihe nach

QString und QMap sind keine Funktionen sondern Klassen oder Objektbeschreibungen oder Objektdefinitionen, nenn es wie du willst. Um in einer eigenen Klasse ein Objekt vom Typ QString zu erzeugen musst du

1. #include <QString> irgendwo stehen haben, möglichst da, wo du es brauchst und
2. eine Instanz der Klasse QString anlegen. Also z.B.

QString name;
name = "Jazzi";

oder gleich QString name("Jazzi");

Siehe dazu auch im QtAssistant zu QString nach. Da stehen die ganzen Instanziierungsmöglichkeiten für den Typ QString. In meinem obigen Beispiel hast du dann also ein Objekt names 'name' erzeugt, welches vom Typ QString ist. Nun kannst du dieses Objekt in deiner Klasse nutzen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Bei non-commercial muss man keine Sourcen mitgeben...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Jazzi
Beiträge: 3
Registriert: 23. August 2006 17:36

Beitrag von Jazzi »

Ok, dass QString keine Funktion im Sinne von C++ ist, ist mir klar, war etwas blöde ausgedrückt von mir.
Allerdings ist QString anscheinend Teil von QObject und demnach keine eigene Klasse. Ein einfaches #include <qstring.h> tut es leider nicht. Das habe ich schon hinter mir. Daher ja meine Frage.

Mit den src. meinte ich die Vereinbarung (mir fehlt jetzt leider der Begriff) seinen Source-Code zur Verfügung zu stellen, wenn man mit der nicht kommerziellen Version arbeitet.

Also: Wie nutze ich nun QString (wie man instanziert weiß ich auch) in einer eigenen Klasse? Muss ich wirklich ableiten und wenn ja wie, Stichwort Parameterübergabe?

Und darf ich das "Non-Commercial" entfernen und wenn ja, wie?
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Hmm,

sorry, ich kann dein Problem leider nicht nachvollziehen. Am besten ich gebe mal ein Beispiel, bevor wir einander vorbeireden:

Header Datei:

Code: Alles auswählen

#ifndef KARTEIKARTE_H
#define KARTEIKARTE_H

#include <QString>

class karteikarte
{
  void setName(QString name);
  QString getName();
  QString name;
}

#endif
CPP-Datei:

Code: Alles auswählen

#include "karteikarte.h"

void karteikarte::setName(QString name)
{
  this->name = name;
}

QString karteikarte::getName()
{
  return name;
}
So, das sollte wohl alles klären.
Zu der Non-Commercial Sache, ich verstehe nicht ganz, welches "Non-Commercial" du entfernen willst, aber was genau erlaubt ist und was nicht steht eigentlich auf der Trolltech WebSite. Vermutlich auch hier irgendwo im Forum, dafür gibts ne Suchfunktion.

Ich hoffe, ich konnte dir helfen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es ist ne binary-Distribution (zus. mit dem Qt-3 - Buch) - also kann man es nicht entfernen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Jazzi
Beiträge: 3
Registriert: 23. August 2006 17:36

Beitrag von Jazzi »

@Christian: Danke für die Antwort.

@Rene: Das habe ich natürlich schon versucht, funktioniert aber leider nicht. Beim Compiliervorgang erzeugt das einen Fehler. Irgendwas in der Richtung er vermisse noch zwei Parameter. Wie die Meldung genau aussieht, muss ich nochmal nachschauen. Ich schreibs dann hier rein.
Trotzdem danke.
Einmaliger
Beiträge: 48
Registriert: 22. Juli 2006 11:42

Beitrag von Einmaliger »

Ich will ja nicht kleinlich sein, aber besser wäre:

Header Datei:

Code: Alles auswählen

#ifndef KARTEIKARTE_H
#define KARTEIKARTE_H

#include <QString>

class karteikarte
{
  void setName(const QString &name);
  const QString &getName() const;
  QString name;
}

#endif
CPP-Datei:

Code: Alles auswählen

#include "karteikarte.h"

void karteikarte::setName(const QString &name)
{
  this->name = name;
}

const QString &karteikarte::getName() const
{
  return name;
}
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Bin mir nicht mehr ganz sicher, aber ich mein bei Qt3 darf man nicht

#include <QString>

schreiben, sondern es heisst dort

#include <qstring.h>

Aber ansonsten muss das funktionieren, jedenfalls hätte ich erstmal keine weitere Idee, eine genaue Fehlerbeschreibung wäre sinnvoll. Meld dich, wenn du mehr Info's hast.

Gruß
René
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Einmaliger hat geschrieben:Ich will ja nicht kleinlich sein, aber besser wäre:
[nörgelmode an]
public für die getter/setter - Methoden vergessen :P
[/nörgelmode an]
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Beitrag von René »

Einmaliger hat geschrieben:Ich will ja nicht kleinlich sein, aber besser wäre: ...
Hi, ok, das const in beiden Memberfunktionen ist in der Tat besser, beim 'set' sollte niemals der übergebene QString manipuliert werden dürfen, beim 'get' niemals der eigene, der zurück gegeben wird.
Dass du Referenzen verwendest, möchte ich mal eben (mir selbst) erklären (bin noch in der Lernphase ;-) öhm, ist man da jemals raus ?).
Ich gehe erstmal davon aus, dass ich keine Referenz verwende, also wird beim Funktionsaufruf durch die Parameterübergabe der QString kopiert in den Speicher, den die aufgerufene Funktion auf dem Stack reserviert bekommt. (Streng genommen liegt nur die Verwaltung von QString auf dem Stack, der (in der Regel unbekannt große) Datenbereich liegt auf dem Heap, wie üblich bei komplexen Datentypen.)

So, durch das bei Qt verwendete "copy on write" oder auch "implicite sharing" Model wird durch die Zuweisung 'this->name = name;' nur dafür gesorgt, dass beide Variablen const name und name auf denselben Speicherbereich zeigen. Außerdem wird der ReferenzCounter für den Datenbereich um 1 erhöht (und beim Verlassen der Funktion wieder um 1 dekrementiert, da const name gelöscht wird). Insgesamt gibt es aber den Speicherbereich für den QString name zweimal, einmal für dort, von wo aus die Funktion setName aufgerufen wird und einmal für das Objekt karteikarte. Wenn man nun stattdessen nur eine Referenz verwendet, also &name, dann gibt es den Speicher, der den QString abbildet nur einmal, denn im Objekt Karteikarte würde name auch nur den gleichen Speicherbereich verwenden, wie der ursprüngliche QString, der dort verwendet wird, wo setName aufgerufen wird.

Hab ich das richtig verstanden ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

René hat geschrieben: Hab ich das richtig verstanden ?
Soweit ich das sehe, ja. Bei der get-Methode ist es das gleiche.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten