Gültigkeitsbereich Klassen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Gültigkeitsbereich Klassen

Beitrag von hardcoding » Mi Dez 05, 2012 10:29 am

Hallo,

Wenn ich diesen Quellcode kompiliere sagt er mir ,dass die int Variablen und in der

Code: Alles auswählen

main()
Funktion in den entsprechenden Gültigkeitsbereichen gar nicht definiert sind.

Code: Alles auswählen

eins.umrechnung(&min, &stu, &day);

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

Code: Alles auswählen

Umrechnung()
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 ===|

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Gültigkeitsbereich Klassen

Beitrag von oenone » Mi Dez 05, 2012 10:45 am

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.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Gültigkeitsbereich Klassen

Beitrag von hardcoding » Mi Dez 05, 2012 10:59 am

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 ?

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Gültigkeitsbereich Klassen

Beitrag von oenone » Mi Dez 05, 2012 11:04 am

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.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Gültigkeitsbereich Klassen

Beitrag von hardcoding » Mi Dez 05, 2012 11:10 am

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Gültigkeitsbereich Klassen

Beitrag von cloidnerux » Mi Dez 05, 2012 11:57 am

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten