Seite 1 von 1
Gültigkeitsbereich Klassen
Verfasst: Mi Dez 05, 2012 10:29 am
von hardcoding
Hallo,
Wenn ich diesen Quellcode kompiliere sagt er mir ,dass die int Variablen
und
in der
Funktion in den entsprechenden Gültigkeitsbereichen gar nicht definiert sind.
Code: Alles auswählen
#include<iostream>
using namespace std;
class zeit
{
private:
double sekunden;
int min,stu,day;
public:
zeit();
int umrechnung(int*,int *,int *);
void auslesen(void)
{
cout << min << endl<< stu << endl << day;
}
};
zeit::zeit()
{
cout <<"Bitte geben Sie die Sekunden an:" << endl;
cin >> sekunden;
}
int zeit::umrechnung(int* mi,int* hours,int* tag)
{
*mi=sekunden/60;
*hours=*mi/60;
*tag=*hours/24;
}
int main()
{
zeit eins;
eins.umrechnung(&min, &stu, &day);
eins.auslesen();
return 0;
}
Er erkennt zwar die min Variable ,aber die restlichen nicht. Alle Variablen befinden sich im Private Bereich und die Schnittstellenfunktion
greift auf die variablen zu.
Fehlermeldung:
Code: Alles auswählen
|35|Fehler: »stu« wurde in diesem Gültigkeitsbereich nicht definiert|
|35|Fehler: »day«wurde in diesem Gültigkeitsbereich nicht definiert|
||=== Build finished: 2 errors, 0 warnings ===|
Re: Gültigkeitsbereich Klassen
Verfasst: Mi Dez 05, 2012 10:45 am
von oenone
du willst also aus main() auf die privaten Instanzvariablen von eins zugreifen?
1. um auf min, stu und day von eins zuzugreifen, musst du auch eins.min, eins.stu und eins.day schreiben.*
2. du darfst darauf nicht außerhalb der Klasse zugreifen, da sie privat sind.
3. überleg dir nochmal, ob du umrechnung() nicht ohne parameter machen willst...
4. im Konstruktor auf cin zugreifen ist unschön.. lies es lieber in main() in eine eigene Variable ein und übergib den Wert an den Konstruktor
* dass "min" gefunden wird liegt daran, dass es etwas anderes ist als du denkst.
Re: Gültigkeitsbereich Klassen
Verfasst: Mi Dez 05, 2012 10:59 am
von hardcoding
1. um auf min, stu und day von eins zuzugreifen, musst du auch eins.min, eins.stu und eins.day schreiben.*
Die Idee ist auch aufgefallen,dennoch hat es nicht geklappt.
2. du darfst darauf nicht außerhalb der Klasse zugreifen, da sie privat sind.
Wozu sind dann die Memberfunktionen da ?!
* dass "min" gefunden wird liegt daran, dass es etwas anderes ist als du denkst.
Wie meinst du das ?
Re: Gültigkeitsbereich Klassen
Verfasst: Mi Dez 05, 2012 11:04 am
von oenone
hardcoding hat geschrieben:2. du darfst darauf nicht außerhalb der Klasse zugreifen, da sie privat sind.
Wozu sind dann die Memberfunktionen da ?!
In der Memberfunktion darfst du auf min, stu und day zugreifen, tust du aber nicht. Du erwartest Parameter und greifst nur auf die Instanzvariable "sekunden" zu. Innerhalb von Umrechnung() kannst du aber auch min, stu und day benutzen und brauchst gar keine extra Parameter.
hardcoding hat geschrieben:* dass "min" gefunden wird liegt daran, dass es etwas anderes ist als du denkst.
Wie meinst du das ?
Durch das "using namespace std;" hast du dir deinen Namespace verschmutzt. Dadurch ist u.a. "std::min" als "min" bekannt.. Das ist eine Funktion aus der Standard-Bibliothek. Ein schönes Beispiel, warum man "using namespace std;" nicht benutzen sollte, erst recht nicht als Anfänger.
Re: Gültigkeitsbereich Klassen
Verfasst: Mi Dez 05, 2012 11:10 am
von hardcoding
In der Memberfunktion darfst du auf min, stu und day zugreifen, tust du aber nicht. Du erwartest Parameter und greifst nur auf die Instanzvariable "sekunden" zu. Innerhalb von Umrechnung() kannst du aber auch min, stu und day benutzen und brauchst gar keine extra Parameter.
Ah ok ich verstehe.
Durch das "using namespace std;" hast du dir deinen Namespace verschmutzt. Dadurch ist u.a. "std::min" als "min" bekannt.. Das ist eine Funktion aus der Standard-Bibliothek. Ein schönes Beispiel, warum man "using namespace std;" nicht benutzen sollte, erst recht nicht als Anfänger.
ui gravierender Fehler. dennoch benutze ich es weiter. ändere ich einfach min und basta.
Code: Alles auswählen
#include<iostream>
using namespace std;
class zeit
{
private:
double sekunden;
double minuten,stu,day;
public:
zeit();
void umrechnung(zeit &egal);
void auslesen(void)
{
cout << minuten << endl<< stu << endl << day;
}
};
zeit::zeit()
{
cout <<"Bitte geben Sie die Sekunden an:" << endl;
cin >> sekunden;
}void zeit::umrechnung(zeit &egal)
{
egal.minuten=egal.sekunden/60;
egal.stu=egal.minuten/60;
egal.day=egal.stu/24;
}
int main()
{
zeit eins;
eins.umrechnung(eins);
eins.auslesen();
return 0;
}
Naja so ist es glaube ich jetzt besser.
Re: Gültigkeitsbereich Klassen
Verfasst: Mi Dez 05, 2012 11:57 am
von cloidnerux
Naja so ist es glaube ich jetzt besser.
Fast. Wie oneone schon sagte: Du kannst auf deine Memebervariablen innerhalb einer zur Klasse gehörenden Funktion zugreifen:
Code: Alles auswählen
void zeit::umrechnung()
{
this->minuten=this->sekunden/60;
this->stu=this->minuten/60;
this->day=this->stu/24;
}
Müsste egt auch ohne this gehen, bin da gerade nicht so drin.