[geloest] Globale Variable?

Alles rund um die Programmierung mit Qt
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

[geloest] Globale Variable?

Beitrag von joebar »

Hallo,

habe ein Problem mit "globalen Variabeln", evtl. mehr ein C++ Problem als Qt, weiss nicht so genau. Lasst mich wissen wenn ich zu off topic bin.

Ich habe einen Code der folgenden Art:

Code: Alles auswählen

function1(){
QString a = "/usr/local";
// mach was mit a (lese etwas)
}

function2(){
QString a = "/usr/local";
// mach was anderes mit a (schreibe etwas)
}

Constructor{ // QDialog
function1();
}

slotSaveButton{ // Save Button gedrueckt
function2();
}
Also im Constructor wenn ich meinen QDialog aufbaue lese ich was aus einem File, der Pfad ist durch die Variable "a" fix vorgegeben. Wenn ich den Save Button druecke speichere ich was in den Pfad wo ich vorher gelesen habe. Ich habe im obigen Beispiel "a" zweimal definiert. Das passt mir nicht...

Ich kann die Variable "a" natuerlich global definieren, da hat man mir aber mal gesagt, dass soll man nur als letzten Ausweg machen. Ist das hier einer?

Ich koennte "a" natuerlich auch im Funktionsaufruf mitgeben, kommt mir aber auch irgendwie komisch vor.

Hat jemand einen Vorschlag wie ich es am besten machen sollte?

Danke,
J.
Zuletzt geändert von joebar am 26. Oktober 2006 18:38, insgesamt 1-mal geändert.
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

So ganz versteh ich dein Problem nicht.

Warum deklarierst du a nicht als Klassenvariable?
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Mein Problem hier ist wohl, dass ich objekt-orientierte Programmierung zusammen mit Qt lerne...

Werde mal versuchen raus zufinden wie man eine Klassenvariable definiert... falls jemand die Musse hat es hier zu posten, nur zu.

Danke fuer das Stichwort,
J.
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag von webmaster1987 »

eine klassen variable ist eine eigenschaft der klasse z.b.

#include <QString>
class test {
public:
int value1; // eigenschaften bzw. Klassenvariablen
int value2; //
char var; //
QString *string; //
test();
}
DOUBLE ist wie FLOAT nur in HD
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

webmaster1987 hat geschrieben: #include <QString>
class test {
public:
int value1; // eigenschaften bzw. Klassenvariablen
int value2; //
char var; //
QString *string; //
test();
}
Die Variablen einer Klasse Public zu machen ist allerdings eine sehr unschoene Sache. Ich wuerde eher folgendes empfehlen:

Code: Alles auswählen

#include <QString>
class test {
 public:
       test();
 private:
       int value1; // eigenschaften bzw. Klassenvariablen
       int value2; //
       char var;   //
       QString *string; //
};
Goos
webmaster1987
Beiträge: 73
Registriert: 2. September 2006 18:30
Wohnort: Köln
Kontaktdaten:

Beitrag von webmaster1987 »

warum? :?:
DOUBLE ist wie FLOAT nur in HD
Sym
Beiträge: 139
Registriert: 15. Mai 2006 15:38
Wohnort: Bremen

Beitrag von Sym »

webmaster1987 hat geschrieben:warum? :?:
Weil Du somit vollen Zugriff auf die Variablen gibst. Somit kannst Du ungewollte Werte zugewiesen bekommen.

Handelt es sich allerdings um private Members, kannst Du mit Gettern und Setters den Zugriff darauf verwalten.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

webmaster1987 hat geschrieben:warum? :?:
Weil du sonst gegen das Konzept der Kapselung arbeitest, welches zu den wichtigsten Aspekten der Objektorientierung gehoert.

Goos
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag von tachyon »

-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

es sollte vielleicht auch noch erwähnt werden, daß ein normaler User in /usr/local nicht schreiben kann (wenn man die Rechte nicht entsprechend verbogen hat).
Gruß Marco
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Das mit dem Pfad war bloss ein Beispiel, war dumm gewaehlt...

Lt Google definiere ich die Klassenvariable einfach im Konstruktor und rufe sie spaeter ueber <class>.<variable> auf, das klappt aber nicht

Code: Alles auswählen

CallIntegrator::CallIntegrator(QDialog *parent) : QDialog(parent){
	QString param_filename = getenv("HOME") + QString("/.callintegrator");
	setupUi(this);
	connect(pushButtonSave, SIGNAL (clicked()), this, SLOT(slotSave()));

}

CallIntegrator::~CallIntegrator(){
}

void CallIntegrator::slotSave(){

	QFile data(CallIntegrator.param_filename); // macht Aerger
	accept();
}
Wo habe ich jetzt den Denkfehler?

Danke,
J.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wo habe ich jetzt den Denkfehler?
Daß du keine Fehlermeldungen liest, geschweige denn uns zeigst...
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

War von einem offensichtlichen Anfaengerfehler ausgegangen... :oops:

Aber hier die Fehlermeldung

guest@linux:~/Desktop/callintegrator> make
g++ -c -pipe -fno-strict-aliasing -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_SHARED -I/usr/share/qt/mkspecs/default -I. -I/usr/include/QtGui -I/usr/include/QtCore -I/usr/include -I. -I. -I. -o callintegrator.o callintegrator.cpp
callintegrator.cpp: In member function ?void CallIntegrator::slotSave()?:
callintegrator.cpp:100: error: expected ?,? or ?...? before ?.? token
callintegrator.cpp:101: error: request for member ?open? in ?data?, which is of non-class type ?QFile ()(CallIntegrator)?
callintegrator.cpp:102: error: no matching function for call to ?QTextStream::QTextStream(QFile (*)(CallIntegrator))?
/usr/include/QtCore/qtextstream.h:215: note: candidates are: QTextStream::QTextStream(const QTextStream&)
/usr/include/QtCore/qtextstream.h:75: note: QTextStream::QTextStream(const QByteArray&, QFlags<QIODevice::OpenModeFlag>)
/usr/include/QtCore/qtextstream.h:74: note: QTextStream::QTextStream(QByteArray*, QFlags<QIODevice::OpenModeFlag>)
/usr/include/QtCore/qtextstream.h:73: note: QTextStream::QTextStream(QString*, QFlags<QIODevice::OpenModeFlag>)
/usr/include/QtCore/qtextstream.h:72: note: QTextStream::QTextStream(FILE*, QFlags<QIODevice::OpenModeFlag>)
/usr/include/QtCore/qtextstream.h:71: note: QTextStream::QTextStream(QIODevice*)
/usr/include/QtCore/qtextstream.h:70: note: QTextStream::QTextStream()
callintegrator.cpp:109: error: request for member ?setPermissions? in ?data?, which is of non-class type ?QFile ()(CallIntegrator)?
callintegrator.cpp:110: error: request for member ?close? in ?data?, which is of non-class type ?QFile ()(CallIntegrator)?
callintegrator.cpp:111: error: expected primary-expression before ?.? token
make: *** [callintegrator.o] Error 1

Hier nochmal der Code von Zeile 100 bis 111

Code: Alles auswählen


	QFile data(CallIntegrator.param_filename);
	if (data.open(QFile::WriteOnly | QFile::Truncate)) {
		QTextStream out(&data);
		out << "c = " << values.key(comboBoxCallProvider -> currentIndex()) << endl;
		if (!(lineEditUsername -> text()).isEmpty())out << "u = " << lineEditUsername -> text() << endl; 
		if (!(lineEditPassword -> text()).isEmpty())out << "p = " << lineEditPassword -> text() << endl; 
		out << "s = " << lineEditSourceNumber -> text() << endl;
		out << "w = " << spinBoxTimeout -> value(); 
	} 
	data.setPermissions(QFile::ReadOwner|QFile::WriteOwner);
	data.close();
	qDebug() << "File " << CallIntegrator.param_filename << " saved.";

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QFile hast du aber schon 'included'?
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Wenn ich param_filename lokal in meiner Methode deklariere und als lokale Variable aufrufe funktioniert alles. Somit sollte QFile auch included sein, oder muss ich hier noch irgendwo ein extra include einbauen?

Danke,
J.
Antworten