Seite 1 von 1

[gelöst] Variablen einer Klasse in statischer Methode

Verfasst: 26. März 2007 14:41
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!

Verfasst: 26. März 2007 15:56
von Christian81
static von der read Funktion weg und fertig - was soll das da?

Re: Variablen einer Klasse in statischer Methode

Verfasst: 26. März 2007 16:24
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.

Verfasst: 26. März 2007 16:53
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 ;)

Verfasst: 26. März 2007 17:12
von Christian81
Dannn muss deine member-Var natürlich auch static sein - wie sollte es sonst funktionieren?

Verfasst: 26. März 2007 17:16
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;
    }
}

Verfasst: 27. März 2007 08:37
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.

Verfasst: 27. März 2007 20:14
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.

Verfasst: 27. März 2007 22:27
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...

Verfasst: 28. März 2007 10:07
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]

Verfasst: 28. März 2007 10:59
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 :)

Verfasst: 28. März 2007 11:40
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?? :)

Verfasst: 28. März 2007 12:26
von upsala
Die Bibel gibts zum kaufen.