Irgendwas läuft da schief...



  • ¡Hola chicos!

    Ich habe in einem dieser dicken Wälzer ein bisschen was über Klassen gelernt und habe jetzt ein kleines Übungsprogramm geschrieben. Eigentlich läuft's ganz okay, aber nur, wenn ich die Zeile "➡ person1.alter_aendern();" weglasse. Wenn ich die Zeile eingefügt habe, gibt mir der Compiler folgende Fehlermeldung für die Zeile "⚠ int alter_aendern()" aus:

    error C4716: 'datensatz::alter_aendern' : must return a value

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class datensatz
    {
    public:
    
    	//Instanzvariablen
    	string name, stadt;
    	int alter, plz;
    
    	//Methoden
    	string name_aendern()
    	{
    		cin >> name;
    	}
    
    	string stadt_aendern()
    	{
    		cin >> stadt;
    	}
    
    	:warning: int alter_aendern()
    	{
    		cin >> alter;
    	}
    
    	int plz_aendern()
    	{
    		cin >> plz;
    	}
    
    	void ausgabe()
    	{
    		cout << "Name: " << name << endl;
    		cout << "Alter: " << alter << endl;
    		cout << "Wohnort: " << plz << " " << stadt <<endl;
    	}
    };
    
    int main()
    {
    	datensatz person1;
    
    	person1.name = "hart.mut";
    	person1.alter = 16;
    	person1.plz = 0815;
    	person1.stadt = "Dorf";
    
    	cout << "Name: " << person1.name << endl;
    	cout << "Alter: " << person1.alter << endl;
    	cout << "Wohnort: " << person1.plz << " " << person1.stadt <<endl;
    
    	:arrow_right: person1.alter_aendern();
    	person1.ausgabe();
    
    	return 0;
    }
    

    Ich sitze nun schon seit 40 Minuten vor dem dummen Bildschirm, was besonders frustrierend ist, wenn man von vornherein weiß, dass der Fehler wahrscheinlich minimal ist.

    Thanks für eure Hilfe!

    //hart.mut



  • ja das sieht aus wie ein doppel post 😡



  • Ganz einfach: Die Funktion wurde als int ...(...) definiert, dass heißt, dass sie einen Integer-Wert zurücklierfen sollte. Diese Funktion jedoch gibt nichts zurück.

    Lösung:
    [cpp]
    int alter_aendern()
    {
    cin >> alter;
    return alter;
    }[/cpp]



  • //hart schrieb:

    ¡Hola chicos!

    Ich habe in einem dieser dicken Wälzer ein bisschen was über Klassen gelernt und habe jetzt ein kleines Übungsprogramm geschrieben. Eigentlich läuft's ganz okay, aber nur, wenn ich die Zeile "➡ person1.alter_aendern();" weglasse. Wenn ich die Zeile eingefügt habe, gibt mir der Compiler folgende Fehlermeldung für die Zeile "⚠ int alter_aendern()" aus:

    error C4716: 'datensatz::alter_aendern' : must return a value

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class datensatz
    {
    public:
    
    	//Instanzvariablen
    	string name, stadt;
    	int alter, plz;
    
    	//Methoden
    	string name_aendern()//fehler . du sagst die funktion gibt einen string
    	{                     // zurück hast aber keine "return " anweisung
    		cin >> name;
    	}
    
    	string stadt_aendern()
    	{
    		cin >> stadt; // siehe oben
    	}
    	
    	:warning: int alter_aendern()
    	{
    		cin >> alter; // du sagst sie soll ein int zurückgeben
    	}                     // aber auch hier kein return 
    
    	int plz_aendern()
    	{
    		cin >> plz;// wie oben
    	}
    
    	void ausgabe()
    	{
    		cout << "Name: " << name << endl;
    		cout << "Alter: " << alter << endl;
    		cout << "Wohnort: " << plz << " " << stadt <<endl;
    	}
    };
    
    int main()
    {
    	datensatz person1;
    
    	person1.name = "hart.mut";
    	person1.alter = 16;
    	person1.plz = 0815;
    	person1.stadt = "Dorf";
    
    	cout << "Name: " << person1.name << endl;
    	cout << "Alter: " << person1.alter << endl;
    	cout << "Wohnort: " << person1.plz << " " << person1.stadt <<endl;
    
    	:arrow_right: person1.alter_aendern();
    	person1.ausgabe();
    
    	return 0;
    }
    

    Ich sitze nun schon seit 40 Minuten vor dem dummen Bildschirm, was besonders frustrierend ist, wenn man von vornherein weiß, dass der Fehler wahrscheinlich minimal ist.

    Thanks für eure Hilfe!

    //hart.mut



  • Du must was zurückgeben...



  • ist doch ganz klar: du hast
    ne function deklariert, die einen int-wert zurückgeben soll,
    aber kein return int; in deiner function 😉

    int alter_aendern()
    {
    cin >> alter;
    return alter;
    }

    Mich wundert eigentlich mehr, dass der compiler sich bei den
    strings nicht beschwert, denn eigentlich fehlt ja
    bei jeder deiner memberfunctions der rückgabe-wert.
    (ausser bei ner void-function, da kannst dir das return sparen 😉 )



  • ROFL ich glaub wir sollten ihm noch fünfmal hinknallen das er returnen muss 😃
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-119579.html



  • steff3 schrieb:

    ja das sieht aus wie ein doppel post 😡

    Reg dich ab, muss nicht unbedingt Absicht gewesen sein...



  • Hallo,

    vielen Dank für eure Antworten. Das Programm funktioniert jetzt.

    Aber jetzt habe ich noch ein paar Fragen zu den Zugriffsspezifizierern in Klassen:

    Die Zugreifer auf die Klasse sitzen doch in der main-Funktion in Form von

    person1.name = "hart.mut";
    

    oder

    person1.alter_aendern();
    

    .

    Was bringt es dem Programmierer, wenn er die Instanzvariablen mit private abschließt und somit die erste der oben aufgeführten Zugriffsformen verbietet? Für den Endanwender macht das doch keinen Unterschied...

    //hart.mut



  • das Prinzip nennt sich Datenkapselung
    so kannst du die Schnittstellen selbst definieren, und somit die Art des Zugriffs kontrollieren,damit der Endanwender auch nur das manipulieren kann was er ändern können soll, und zwar so wie er es soll.


Anmelden zum Antworten