Seite 1 von 2

[geloest] Globale Variable?

Verfasst: 25. Oktober 2006 02:43
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.

Verfasst: 25. Oktober 2006 06:25
von Vaaco
So ganz versteh ich dein Problem nicht.

Warum deklarierst du a nicht als Klassenvariable?

Verfasst: 25. Oktober 2006 06:45
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.

Verfasst: 25. Oktober 2006 08:15
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();
}

Verfasst: 25. Oktober 2006 10:30
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

Verfasst: 25. Oktober 2006 14:34
von webmaster1987
warum? :?:

Verfasst: 25. Oktober 2006 15:07
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.

Verfasst: 25. Oktober 2006 15:12
von Goos
webmaster1987 hat geschrieben:warum? :?:
Weil du sonst gegen das Konzept der Kapselung arbeitest, welches zu den wichtigsten Aspekten der Objektorientierung gehoert.

Goos

Verfasst: 25. Oktober 2006 16:29
von tachyon

Verfasst: 25. Oktober 2006 16:58
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).

Verfasst: 25. Oktober 2006 18:22
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.

Verfasst: 25. Oktober 2006 19:37
von upsala
Wo habe ich jetzt den Denkfehler?
Daß du keine Fehlermeldungen liest, geschweige denn uns zeigst...

Verfasst: 25. Oktober 2006 19:53
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.";


Verfasst: 25. Oktober 2006 21:07
von upsala
QFile hast du aber schon 'included'?

Verfasst: 25. Oktober 2006 21:31
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.