Hallo,
irgendwie blick ich gerade nicht mehr ganz durch bei C++... evtl.
könntet ihr mir hier mal auf die Sprünge helfen. Soweit bin ich
schonmal:
Ein Objekt enthält quasi "alles", also Eigenschaften, Funktionen etc.
und belegt dementsprechend auch Speicher.
Ein Zeiger enthält nur die Adresse auf ein Objekt. Wenn man den Zeiger
ausliest, erhält man die Adresse. "Symbol": *
Eine Referenz enthält auch nur die Adresse eines Objektes. Jedoch kann
man die Referenz wie ein Objekt behandeln. "Symbol": &
Nun würde ich gerne eine statische Klasse definieren, um Einstellungen
zu speichern. Momentan sieht das wie folgt aus:
settings.h
Nur leider erhalte ich hier einen Fehler vom kompilier:
1
settings.cpp:22: Fehler:no match for 'operator=' in 'settings::access = (((const QString&)(& QString(((const char*)"C:/blablabla")))), (operator new(8u), (<statement>, ((QSettings*)<anonymous>))))'
2
3
qsettings.h:304: candidate is: QSettings& QSettings::operator=(const QSettings&)
Ich hab schon alles mögliche probiert, also mit "*" und "&", aber
irgendwie hat es nie funktioniert :/
Wie mache ich das am besten? Und der Umweg mit "settingsLoad" kann man
doch bestimmt auch schöner machen und einfach direkt Prüfen, ob das
Objekt exsistiert, oder?
In einer anderen Klasse hab ich das ganze z.B. so gelöst, was auch ohne
Probleme funktioniert:
basic_storage.h
Hallo Julian,
in Deiner settings-Klasse deklarierst Du access nicht als Zeiger sondern
als "normale" Membervariable vom Typ QSettings. In
sessings::checkAviable() erzeugst Du dann aber mit new ein neues
QSettings-Objekt auf dem Heap und versuchst dann den Zeiger auf dieses
an Deine Membervariable access zuzuweisen. Deswegen meckert der
Compiler.
In Deiner Storage-Klasse wiederum machst Du es ja richtig: _sql ist ein
Zeiger vom Typ storage::sql. Deswegen klappt es dort auch mit dem new
;-)
kaffeedoktor
Hallo Julian,
für Deine statischen Membervarialben musst Du natürlich auch noch
irgendwo Speicher reservieren. Bisher hast Du sie ja nur deklariert.
Also am besten in die settings.cpp an den Anfang
bool settings::settingsLoad = false;
QSettings* settings::access = NULL;
So kannst Du sie auch gleich initialisieren.
kaffeedoktor
kaffeedoktor schrieb:> bool settings::settingsLoad = false;> QSettings* settings::access = NULL;
Danke, das war's gewesen :)
Hat mich nur gewundert, dass er über "settingsLoad" sich erst beschwert
hatte, als ich "access" als Pointer anlegte...
Karl Heinz Buchegger schrieb:> Wenn in deiner Klasse sowieso alles static ist, wozu dann überhaupt eine> Klasse?
Nunja, der Übersichtlichkeit wegen halt ;)
So kann ich über "settings::blablabla" auf alles schön über die
Autovervollständigung zugreifen.
Hallo Julian,
über settingsLoad hat sich der Linker beschwert, während beim Problem
mit dem QSettings-Zeiger der Compiler gemeckert hat. Und solange der
Compiler meckert, fängt der Linker erst garnicht das Arbeiten an.
kaffeedoktor
Doch leider funktioniert es nicht :/
Die Datei existiert. Ob ich \\ oder / beim Pfad verwende macht keinen
Unterschied.
Weiß einer, was ich falsch mache?
Julian W. schrieb:> Noch ne Frage zu QSettings:> Ich hab das ganze jetzt mal so umgeschrieben:
Keine gute Idee
> QSettings* settings::access = new> QSettings("J:\\repo\\lucifer\\settings.ini", QSettings::IniFormat);
Das wird ausgeführt, wenn das Programm hochfährt. Zu diesem Zeitpunkt
ist aber noch lange nicht gewährleistet, dass QT überhaupt schon
komplett und vollständig initialisiert und arbeitsfähig ist.
> Weiß einer, was ich falsch mache?
Dein Verständnis über C++ ist noch mangelhaft. Welche C++-Literatur
benutzt du?
Wenn du von einer Klasse nur 1 einziges Objekt haben willst, dann macht
man das nicht, indem man alle Member static macht, sondern indem man das
Singleton Pattern anwendet (danach googeln). Dann hat man wieder im
Konstruktor den perfekten Platz um derartige Initialisierungen
unterzubringen.
Karl Heinz Buchegger schrieb:> Das wird ausgeführt, wenn das Programm hochfährt. Zu diesem Zeitpunkt> ist aber noch lange nicht gewährleistet, dass QT überhaupt schon> komplett und vollständig initialisiert und arbeitsfähig ist.
Gut, ich habe es dann mal so umgeschrieben:
Die Funktion "getSavingLoginData" wird definitiv nur einmal aufgerufen
und dass auch erst, wenn bereits ein Fenster angezeigt wird, von daher
sollte QT komplett initialisiert und arbeitsfähig sein.
Trotzdem funktioniert der Code nicht...
Um sicher zu gehen, dass die Funktionen wirklich aufgerufen werden, hab
ich testweise folgenden Code in main eingefügt:
Julian W. schrieb:>> Wenn in deiner Klasse sowieso alles static ist, wozu dann überhaupt eine>> Klasse?>> Nunja, der Übersichtlichkeit wegen halt ;)> So kann ich über "settings::blablabla" auf alles schön über die> Autovervollständigung zugreifen.
Dazu bietet sich ein Namespace an.
Solche Pseudo-Klassen sind eher in Java üblich, weil dort Funktionen
zwangsweise immer in Klassen sein müssen.
Das kann in C++ auch Sinn machen.
Spätestens sobald in der statischen Klasse neben reinen Daten auch
zugehörige Methoden nützlich werden, wie z.B. Initialisierung,
Persistenz oder was auch immer.
Klaus Wachtler schrieb:> Das kann in C++ auch Sinn machen.
Eine Klasse, bei der alles static ist, ist in meinen Augen immer
unsinnig. Sie wird weder jemals instanziiert, noch bringt es was, davon
abzuleiten, und damit fehlt alles, was eine Klasse im Sinne von
Objektorientierung ausmacht.
> Spätestens sobald in der statischen Klasse neben reinen Daten auch> zugehörige Methoden nützlich werden, wie z.B. Initialisierung,> Persistenz oder was auch immer.
Ich weiß nicht genau, was du damit meinst.