[gelöst] Variablen einer Klasse in statischer Methode

Verschiedenes zu Qt
Antworten
christian.h
Beiträge: 21
Registriert: 9. Januar 2007 13:35
Wohnort: Ludwigshafen
Kontaktdaten:

[gelöst] Variablen einer Klasse in statischer Methode

Beitrag von christian.h »

Hallo,

ich bekomme dauernd ein Fehlermeldung, sobald ich mit meiner QMap-Variable arbeiten möchte.

Ich befürchte, dass ich das Prinzip der statischen Methoden und Variablen noch nicht so ganz verstanden habe.

Hier mal ein bisschen Quellcode:

settings.h

Code: Alles auswählen

#ifndef SETTINGS_H
#define SETTINGS_H

#include <qmap.h>

class Settings
{
    //Q_OBJECT
    
public:
    Settings( );
    ~Settings( );
    
    static bool read();
    
private:
    
    QMap<QString, QString> mapSettings;

};

#endif // SETTINGS_H
settings.cpp

Code: Alles auswählen

#include <qfile.h>

#include "../headers/settings.h"

Settings::Settings()
{    
    
}

bool Settings::read()
{

    QFile file ( "ini_files/program_settings.ini" );
    
    if ( file.open ( IO_ReadOnly ) ) {
	QTextStream stream ( &file );
	QString line;
	
	while ( !stream.atEnd() ) {
	    line = stream.readLine().latin1();
	    QStringList split = QStringList::split( "=", line, true );
	    mapSettings[split[0]] = split[1];
	} file.close();
	return true;
    }
    else {
	return false;
    }
}

Settings::~Settings()
{
    // no need to delete child widgets, Qt does it all for us
}
Aufruf irgendwo im Code:

Code: Alles auswählen

if( Settings::read() ) QMessageBox::information( this, "MsgBox", "OPEN!", "OK");
Fehlermeldung:
sources/../headers/settings.h: In static member function âstatic bool Settings::read()â:
sources/../headers/settings.h:19: error: invalid use of member âSettings::mapSettingsâ in static member function
sources/settings.cpp:26: error: from this location
make: *** [.obj/settings.o] Fehler 1


Ich nehme an, dass es ein Anfänger-Fehler ist.
Da ich aber momentan nicht weiter weiß, wende ich mich mal an euch!

Danke im Voraus!
Zuletzt geändert von christian.h am 28. März 2007 10:07, insgesamt 1-mal geändert.
MfG Christian Hoffmann
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

static von der read Funktion weg und fertig - was soll das da?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerome69
Beiträge: 188
Registriert: 28. April 2006 22:50
Wohnort: Berlin
Kontaktdaten:

Re: Variablen einer Klasse in statischer Methode

Beitrag von gerome69 »

christian.h hat geschrieben:

Code: Alles auswählen

    QFile file ( "ini_files/program_settings.ini" );
    
    if ( file.open ( IO_ReadOnly ) ) {
	QTextStream stream ( &file );
	QString line;
	
	while ( !stream.atEnd() ) {
	    line = stream.readLine().latin1();
	    QStringList split = QStringList::split( "=", line, true );
	    mapSettings[split[0]] = split[1];
	} 

Unabhängig mal von deinem static-Problem, was ja schon beantwortet wurde:
Das mußte nicht neu erfinden.
Dafür gibt es doch QSettings zB so:

Code: Alles auswählen

QSettings configSettings("/path/to/your/ini",QSettings::IniFormat);
configSettings.setFallbacksEnabled(FALSE);
QString mySettings=configSettings.value("YOUR_ENTRY").toString();
B.
christian.h
Beiträge: 21
Registriert: 9. Januar 2007 13:35
Wohnort: Ludwigshafen
Kontaktdaten:

Beitrag von christian.h »

Christian81 hat geschrieben:static von der read Funktion weg und fertig - was soll das da?
Ohne static kann ich die read()-Methode und auch die folgenden Methoden, die noch implementiert werden sollen nur mit einem Objekt ansprechen. Ich will die Methoden aber direkt absprechen können. z.B. Settings::read();
gerome69 hat geschrieben:Das mußte nicht neu erfinden.
Dafür gibt es doch QSettings zB so:
Mit QSettings ist es bestimmt schneller gemacht und effizienter gelöst.
Aber mir geht es nicht nur um eine schnelle und gute Lösung ich will dabei etwas lernen und auf die Art und Weise wie ich es versuche (mit ner eigenen Klasse) lerne ich deifinitiv mehr ;)
MfG Christian Hoffmann
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dannn muss deine member-Var natürlich auch static sein - wie sollte es sonst funktionieren?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Dann nimm statt einer Klasse nen Namespace und implementiere eine C Funktion.

settings.h

Code: Alles auswählen

#ifndef SETTINGS_H
#define SETTINGS_H

namespace Settings
{
    bool read();
}

#endif // SETTINGS_H
settings.cpp

Code: Alles auswählen

namespace Settings
{
    bool read()
    {
          /// code hier
          return true;
    }
}
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
christian.h
Beiträge: 21
Registriert: 9. Januar 2007 13:35
Wohnort: Ludwigshafen
Kontaktdaten:

Beitrag von christian.h »

Christian81 hat geschrieben:Dannn muss deine member-Var natürlich auch static sein - wie sollte es sonst funktionieren?
sorry. das hatte ich direkt nach dem post gemerkt aber dann vergessen zu editieren.

es kam immernoch ein fehler / ich könnte die static variable nicht verändern bzw mit werten füllen.
bis ich die variable mit dem befehl hier initialisiert hab (in der settings.cpp - außerhalb der methoden)

Code: Alles auswählen

QMap<QString, QString> Settings::mapSettings = QMap<QString, QString>();
Volker hat geschrieben:Dann nimm statt einer Klasse nen Namespace und implementiere eine C Funktion.
werde ich mal versuchen. danke für den tip.
MfG Christian Hoffmann
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

du kannst deiner Klassenmethode static bool read() auch ein Objekt als Parameter mitgeben und dann auf die Daten des Objekts zugreifen.

Code: Alles auswählen

class Settings
{
...
   static bool read(const Settings& obj)
   {
       doWhat(obj.getMap());
   }
};
...
Ich denke aber, du solltest dein Klassendesign noch mal überdenken, dann sollten statische Member überflüssig werden.
Gruß Marco
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ein Singleton wäre eine Option wenn es wirklich eine Klasse sein sollte. Zum Lernen würde ich außerdem nicht versuchen QSettings zu emulieren sondern was leichteres. Und man sollte C++ Grundlagen mitbringen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
christian.h
Beiträge: 21
Registriert: 9. Januar 2007 13:35
Wohnort: Ludwigshafen
Kontaktdaten:

Beitrag von christian.h »

Hallo,

zunächst mal danke für eure Hilfen und eure Tips.

Da ich erst seit ein paar Wochen mit objektorientiertem C++ und Qt in dieser Kombination arbeite, darf man denke ich auch nicht so viel von mir erwarten :)
Ich wusste ja von Anfang an, dass es wohl ein Anfänger-Problem ist (deshalb steht auch der Thread im "Einfach Qt"-Unterforum).

Ich werde mir den Tip von Volker zu Herzen nehmen und versuchen meine Settings in ein Namespace unterzubringen. (Natürlich erst nach einer kleinen Studie über dieses Thema per Internet).

Natürlich hat auch gerome69 recht, wenn er sagt, dass man das Rad nicht neu erfinden muss; aber ich werde auf diese Art und Weise noch weitere INI-Files auslesen müssen, die nicht dem INI-Standard (name=wert) entsprechen. Deshalb habe ich vorsorglich versucht mir eine eigene Lösung zu erstellen.

@Christian81: Es muss natürlich nicht unbedingt eine Klasse sein, solange es meine Anforderungen erfüllt und kein Spagetti-Code rauskommt.
Was Objektorientierte Programmierung mit C++ angeht fehlen tatsächlich etwas die Kenntnisse aber ich denke ich bin auf gutem Wege - jeder lernt dazu.
Singleton wäre wohl für meinen aktuellen Wissensstand tatsächlich etwas zu hoch gegriffen :) - Das werde ich versuchen, wenn ich mich vom Wissen her im Forgeschrittenen Status befinde.

Nochne letzte Frage an alle: Gibt es gute C++-Literatur evtl auch in ebook-Form (legal) zum Download (evtl gegen einen Aufpreis)?
(Speziell was die OOP mit C++ angeht)

Danke.
[Titel abgeändert in: gelöst]
Zuletzt geändert von christian.h am 28. März 2007 11:43, insgesamt 1-mal geändert.
MfG Christian Hoffmann
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Zu C++ gibt es nur ein gutes Buch: von Straustroup... Verlangt aber ein gewisses Abstraktionsvermögen... Das braucht man aber ohnehin beim Programmieren, ist also auch eine gute Übung :)
christian.h
Beiträge: 21
Registriert: 9. Januar 2007 13:35
Wohnort: Ludwigshafen
Kontaktdaten:

Beitrag von christian.h »

lepsai hat geschrieben:Zu C++ gibt es nur ein gutes Buch: von Straustroup... Verlangt aber ein gewisses Abstraktionsvermögen... Das braucht man aber ohnehin beim Programmieren, ist also auch eine gute Übung :)
Ich denke auf jeden Fall, dass ich ein gewisses Abstraktions-Vermögen besitze. Ich beschäftige mich schon länger mit dem Programmieren. Nur leider erst seit kurzem so richtig mit C++. Alles, was ich vorher in C++ programmiert hatte waren nur simple Hello-World-Artige "Programme" in der Schule.

Gibt es das Straustroup als Buch zu kaufen oder meinst du evtl das C++ Tutorial, das ich durch den Suchbegriff "Straustroup" bei google gefunden habe?? :)
MfG Christian Hoffmann
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Die Bibel gibts zum kaufen.
Antworten