C++ expected unqualified-id before "return"

Hab ein Problem bei nem selbstgeschriebenen C++ Code


Hier der Code:
Code:
#include "Header.hpp"

int main()
{
    pocalc taschenrechner;   
    calc rechnung;   
    
    std::cout << "Welcome to the Int-Calc v1.0" << std::endl;    
    std::cout << "\n********************************************************************\n";
    std::cout << "\nPlease type two numbers you want to calculate with.\n";
    
    std::cout << "\nNumber 1: ";     
    taschenrechner.Seta();    
    std::cout << "\nNumber 2: ";    
    taschenrechner.Setb();    
    
    rechnung.Setab(taschenrechner.GetVariablea(), taschenrechner.GetVariableb());
    
    std::cout << "\n********************************************************************\n";        
    std::cout << "\n\nWhich operation of calculating do you want to use?" << std::endl;
    
    std::cout << "\n1 Addition\n";
    std::cout << "2 Subtraction\n";
    std::cout << "3 Multiplication\n";
    std::cout << "4 Division\n" << std::endl;
    std::cout << "Mode of Operation: ";    
    std::cin >> rechnung.moo;
    
    if (rechnung.moo == 1)
        return rechnung.addition(int a, int b);
    else
    {
        if (rechnung.moo == 2)
            return rechnung.subtraction(int a, int b);
        else
        {
            if (rechnung.moo == 3)
                return rechnung.multiplication(int a, int b);
            else
            {
                if (rechnung.moo == 4)
                    return rechnung.division(int a, int b);
            }
        }
    }
    
                                
        
        
    return 0;
}
header.hpp
Code:
#include <iostream>

class pocalc
{
    public:
        void Seta()              {std::cin >> a;}
        void Setb()              {std::cin >> b;}
        int GetVariablea() const {return a;} 
        int GetVariableb() const {return b;}
    private:
        int a, b;
};

class calc
{
    public:
        void Setab          (int ab, int ba)    {a = ab; b = ba;}
        int GetResult       () const            {return Result;}
        int addition        (int a, int b)      {Result = a + b;}
        int subtraction     (int a, int b)      {Result = a - b;}
        int multiplication  (int a, int b)      {Result = a * b;}
        int division        (int a, int b)      {Result = a / b;}
        int moo;            //mode of operation
    private:
        int a, b, Result;
};

Hoffentlich könnt ihr mir helfen..komme nicht mehr weiter :(

PS:Fange gerade an C++ zu lernen. :baby:
 
wieso "std::return"?
return gehört nicht zum std-namespace sondern es ist ein ganz normals Schlüsselwort. Man schreibt ja auch nicht "std::if" oder std::while" oder "std::int"
 
Hab geändert (hier und im Code)

neue Fehlermeldungen:

In function `int main()':
30: error: expected primary-expression before "int"
30: error: expected primary-expression before "int"
34: error: expected primary-expression before "int"
34: error: expected primary-expression before "int"
38: error: expected primary-expression before "int"
38: error: expected primary-expression before "int"
42: error: expected primary-expression before "int"
42: error: expected primary-expression before "int"

PS: Kann ich bei den if statements als Parameter int a, int b angeben?
Oder muss/Kann es rechnung.a sein ?
 
also mir sind beim Drüberschauen so einige Fehler aufgefallen, aber davon nicht entmutigen lassen ;)


z.B. in deiner Klasse calc:

Code:
int addition        (int a, int b)      {Result = a + b;}

das int am Anfang ist der Rückgabetyp der Funktion, sie muss also 'int' zurückgeben. In der Funktionsspezifikation {Result = a + b;} ist allerdings nur eine Zuweisung, es wird gar nichts zurückgegeben (kein return).
Wenn du eine Funktion nichts zurückgeben lassen willst, dann musst du sie als void deklarieren (void funktionsname(typ parameter1, typ parameter2) usw.)

das gleiche passiert dann noch in 3 anderen Funktionen.


Jetzt zu den Fehlern in zeile 30, 34, 38 & 42:

du schreibst dort folgendes:
Code:
return rechnung.addition(int a, int b);

das return ist dazu da, das, was dahintersteht, zurückzugeben. entweder es steht etwas 'direktes' dahinter (z.B. "return 4;") oder ein funktionsaufruf (return eineFunktionDieEtwasZurückgibt(); ), dabei wird dann die Rückgabe der Funktion returned.

was du geschrieben hast, ist aber kein funktionsaufruf, denn bei einem Funktionsaufruf werden die datentypen nicht mehr angegeben (wieso auch, wenn du einer funktion eine variable übergibst, die du vorher angelegt hast und der du dabei auch einen datentyp gegeben hast, weiß das programm ja schon, was für einen datentyp die variable hat). Datentypen werden nur bei der Deklaration (Bekanntmachung) der Funktion mitangegeben, um festzulegen, was für Datentypen die Funktion überhaupt annehmen kann.

Du könntest die funktion z.B. so aufrufen:
Code:
// hier werden erstmal 2 ints dekariert & definiert
int zahl1 = 17, zahl2 = 42;
// hier wird die Funktion aufgerufen
rechnung.addition(zahl1, zahl2);

EDIT: argh, ihr habt natürlich recht :)

und was macht die funktion jetzt?
im Header steht ja:

Code:
int addition        (int a, int b)      {Result = a + b;}

da wir 17 und 42 übergeben haben, würde in 'Result' 59 geschrieben werden, wenn das programm überhaupt ausgeführt werden würde (Es steht ja da, dass die Funktion einen int zurückgibt, was sie ja aber nicht tut, das Programm wird somit gar nicht erst kompiliert).


PS:
lies das Kapitel über Funktionen in deinem C++ Buch nochmal (falls du keins hast, solltest du dir unbedingt eins zulegen, denn die meisten Online-Tutorials etc. bringen einem C++ nur lückenhaft bei, ich weiß noch, als ich damals versucht habe, C++ mit tuts aus dem internet zu lernen... ;) )
 
Danke an dich heinzelott ,du hast mir sehr geholfen. :]

1. Ich hatte wegen cin und cout gedacht, dass alle Funktionen in Header gespeichert sind und habe deswegen vor return ein std:: gemacht.

2.Ich weiß auch nicht, warum ich da int gemacht habe. Das mit return verstehe ich schon einigermaßen :rolleyes:

3.Dein Code verstehe ich nicht ganz:
Code:
// hier werden erstmal 2 ints dekariert & definiert
int zahl1 = 17, zahl2 = 42;
// hier wird die Funktion aufgerufen
rechnung.addition(a, b);
[CODE]

und was macht die funktion jetzt?
im Header steht ja:
wenn die ints zahl1 und zahl2 heißen, warum schreibst du dann in den Funktionsaufruf als Parameter a und b?

3.Du sagtest, ich solle die ints in meiner Klasse durch void ersetzen.
Aber dann kommt ein Fehler beim Kompilieren:
Code:
30 G:\Programmiersprachen\cpp\My Project - Int-Calc v0.1\Int-Calc v0.1.cpp void value not ignored as it ought to be
Wenn ich das int lasse, kommt kein Fehler.
Was ist da jetzt richtig und warum ist void falsch, wenn ich doch nichts zurückgebe?

PS: Ich habe zwei Bücher über C++.

Von Markt und Technik hab ich "Jetzt lerne ich C++" (aber da ich es nur ausgeliehen habe, stehe ich unter Zeitdruck und kann da nicht auf alles achten).

Und dann habe ich noch das Buch von Bjarne Stroustrup "The C++ Programming Language SPECIAL EDITION". (gekauft)

thx! :)
 
Original von PS3-690
3.Dein Code verstehe ich nicht ganz:
Code:
// hier werden erstmal 2 ints dekariert & definiert
int zahl1 = 17, zahl2 = 42;
// hier wird die Funktion aufgerufen
rechnung.addition(a, b);
wenn die ints zahl1 und zahl2 heißen, warum schreibst du dann in den Funktionsaufruf als Parameter a und b?

das hattest du richtig erkannt. ich denke mal, er meinte da nicht a und b sondern zahl1 und zahl2.


3.Du sagtest, ich solle die ints in meiner Klasse durch void ersetzen.
Aber dann kommt ein Fehler beim Kompilieren:
Code:
30 G:\Programmiersprachen\cpp\My Project - Int-Calc v0.1\Int-Calc v0.1.cpp void value not ignored as it ought to be
Wenn ich das int lasse, kommt kein Fehler.
Was ist da jetzt richtig und warum ist void falsch, wenn ich doch nichts zurückgebe?

poste doch einfach nochmal deinen aktuellen code. es ist schwierig zu raten, wie dein code nun genau aussieht.
 
Hier ist mein vollständiger Code:
Int-Calc v1.0.cpp
Code:
#include "Header.hpp"

int main()
{
    pocalc taschenrechner;   
    calc rechnung;   
    
    std::cout << "Welcome to the Int-Calc v1.0" << std::endl;    
    std::cout << "\n********************************************************************\n";
    std::cout << "\nPlease type two numbers you want to calculate with.\n";
    
    std::cout << "\nNumber 1: ";     
    taschenrechner.Seta();    
    std::cout << "\nNumber 2: ";    
    taschenrechner.Setb();    
    
    rechnung.Setab(taschenrechner.GetVariablea(), taschenrechner.GetVariableb());
    
    std::cout << "\n********************************************************************\n";        
    std::cout << "\n\nWhich operation of calculating do you want to use?" << std::endl;
    
    std::cout << "\n1 Addition\n";
    std::cout << "2 Subtraction\n";
    std::cout << "3 Multiplication\n";
    std::cout << "4 Division\n" << std::endl;
    std::cout << "Mode of Operation: ";    
    
    std::cin >> rechnung.moo;
    
    rechnung.SetResult(rechnung.smoo());
    
    std::cout << "The result is " << rechnung.GetResult() << "." << std::endl;
    
    std::cin >> rechnung.wait;
    
    return 0;
}

Header.cpp
Code:
#include <iostream>

class pocalc
{
    public:
        void Seta()              {std::cin >> a;}
        void Setb()              {std::cin >> b;}
        int GetVariablea() const {return a;} 
        int GetVariableb() const {return b;}
    private:
        int a, b;
};

class calc
{
    public:
        void Setab          (int ab, int ba)    {a = ab; b = ba;}
        void SetResult      (int ab)            {Result = ab;}
        int addition        (int a, int b)      {Result = a + b;}
        int subtraction     (int a, int b)      {Result = a - b;}
        int multiplication  (int a, int b)      {Result = a * b;}
        int division        (int a, int b)      {Result = a / b;}
        int Geta             () const            {return a;}
        int Getb             () const            {return b;}
        int GetResult        () const            {return Result;}
        int smoo             ();         /* set mode of operation */           
        int moo;                        //mode of operation
        int wait;
    private:
        int a, b, Result;
};

int calc::smoo()
{
    if (moo == 1)
        return addition(Geta(), Getb());
    else
    {
        if (moo == 2)
            return subtraction(Geta(), Getb());
         else
         {
             if (moo == 3)
                 return multiplication(Geta(), Getb());
             else
             {
                 if (moo == 4)
                     return division(Geta(), Getb());
             }
        }
    }
}
 
Hübsch Euch zuzusehen; paßt auf, daß Ihr nicht aneinander vorbeiredet!

Die Tips, die "Heinzelotto" gegeben hat, dürften so gemeint sein, daß sie Dich zum Nachdenken anregen sollen.


Meine eigene Meinung:

Wenn ich mir so Dein Programm ansehe, vermute ich, daß es Dir nicht auf effektives Formulieren, sondern auf das Ausprobieren des Prinzips von "objektorientierter" Betrachtungsweise geht.

Wenn das stimmt, bist Du auf dem richtigen Weg.
(Auch wenn damit aus einem 10-Zeiler ein 100-Zeiler wird ;-> )

Du benötigst allerdings noch ein bißchen Einarbeitung in die Syntax von C bzw. C++.
Eventuell solltest Du einen Schritt nach dem anderen tun.

Also: ERST das Definieren von Funktionen und Variablen lernen, bis der Compiler keine trivialen Syntaxerrors mehr schmeißt.

DANN beides verknüpfen zu einem System, in dem Du bereits über drei Ebenen Variablen schieben und verarbeiten lassen willst.

----

Im Einzelnen:

1. In C(++) werden Datentypen NICHT bei einem Funktionsaufruf notiert.
Sondern NUR bei der DEKLARATION von Daten und Funktionen.

2. Das aus Pascal bekannte "result" gibt es in C(++) nicht. Hier gibt es nur einen impliziten Platz für einen Wert IN einem return-Statement.

Du schreibst also NICHT:

int machwasmit ( int diesen_Daten) {result := operation(diesen_Daten);}

SONDERN:

int machwasmit ( int diesen_Daten) {return operation(diesen_Daten);}

Erkennst Du den Unterschied?
Im "return"-Statement DARFST UND MUSST Du, WENN Du deklariert hast, daß die Funktion ein Resultat zurückgeben soll, UNMITTELBAR den zurückzugebenden Wert notieren. Es gibt NICHT wie bei Pascal eine implizit eingeführte Variable namens "result".

OK?

(Du KANNST natürlich zwischendurch in einer Funktion auch die schlimmsten komplexen Dinge anstellen, aber ganz zum Schluß in einem Return-Statement (in JEDEM, um genau zu sein) muß genau der deklarierte einzelne Return-Wert in einem Ausdruck entstehen.)

Kurze Programmänderung, dann poste nochmal das Programm samt Fehlern.

Deine Herangehensweise ist ansonsten korrekt.
Du scheinst mit dem Thema an sich vertraut zu sein.
Nach diesen ersten wenigen Gewöhnungssachen wünsche ich Dir viel Spaß am weiteren Programmieren!
 
1. Ja, du hast Recht. Ich bin gerade bei dem Kapitel mit Klassen gewesen und da wollte ich erstmal OOP üben. :D

2. Result soll kein Befehl sein. Es bedeutet, dass er das Zurückgegebene der Variable Result zuweist (header.cpp zeile 30).

3.
Kurze Programmänderung, dann poste nochmal das Programm samt Fehlern.

Warum sollte ich das Programm nochmal mit Fehlern posten?
Ich habe es dank Heinzelottos Hilfe geschafft, dass keine Fehler kommen. ;)

danke

4.Du sagtest, ich solle die ints in meiner Klasse durch void ersetzen.
Aber dann kommt ein Fehler beim Kompilieren:
code:

Code:
30 G:\Programmiersprachen\cpp\My Project - Int-Calc v0.1\Int-Calc v0.1.cpp void value not ignored as it ought to be
Wenn ich das int lasse, kommt kein Fehler.
Was ist da jetzt richtig und warum ist void falsch, wenn ich doch nichts zurückgebe?
 
Zurück
Oben