0 Daumen
295 Aufrufe

Der Code:

#include <iostream>
#include <string>
#include <vector>

class Car
{
    public:
        std::string brand;
        int ps;
    void printCar(const Car &car)
    {
        std::cout << brand << " : " << ps;
       
    }

};



int main()
{
   
    //Ich erschaffe nun Autos
    Car c1;
    c1.brand = "bmw";
    c1.ps = 330;
   
    //Ich erschaffe nun ein weiteres Auto
    Car c2;
    c2.brand = "mercedes";
    c2.ps = 330;
   
    //Ich rufe nun enie Funktion auf (Die ich oben noch definiere) die mit dem Auto was macht.
    c.printCar();
   
   
    return 0;
}


Fehlermeldungen:
Es geht um die fast letzte Zeile wo ich die Funktion aufrufe mit dem Befehl: c.printCar();

So meldet es mir den Fehler: use of undeclared identifier 'c'

Wenn ich aber das c zu einer c2 ändere, dann meldet es mir einen neuen Fehler und kompiliert wieder nicht: 
''Too few arguments to function call, single argument 'car' was not specified.''

Frage:
Der Beispielcode nutzt using namespace std. 
Ich nicht, hat es damit etwas zu tun ? 
Wie kriege ich es zum kompilieren ? 

von

1 Antwort

+2 Daumen
 
Beste Antwort

Aloha :)

Die Methode void printCar(const Car &car) ist falsch deklariert, sie müsste einfach nur als void printCar() deklariert sein. Du rufst die Methode ja für ein Auto auf, indem du c2.printCar() schreibst. Das Objekt c2 wird der Methode printCar() dann als "internes Objekt" übergeben. Genau genommen erhält die Methode printCar() einen Zeiger auf das Objekt c2. Diesen Zeiger kannst du mit dem Schlüsselwort this innerhalb der Methode verwenden, um auf die Member-Variablen des Objektes zugreifen zu können. Ganz exakt müsste deine Methode so aussehen:
void printCar() {
std::cout << this->brand << ":" << this->ps << endl;
}

Mit dem Aufruf c1.printCar() zeigt der this-Zeiger auf das Objekt c1. Mit dem Aufruf c2.printCar() zeigt der this-Zeiger auf das Objekt c2. Da C++ aber eine Sprache ist, die viel vor dem Entwickler versteckt, kannst du das this-> vor den Member-Variablen auch einfach weglassen. C++ ergänzt das dann automatisch. In diesem Fall sähe die Methode dann genau so aus, wie du sie definiert hast:

void printCar() {
std:cout << brand << ":" << ps << endl;

Das von dir erwähnte "using namespace std" sorgt nur dafür, dass der Namensraum std in deiner CPP-Datei sichtbar wird. Dadurch kannst du dann beim Aufruf von std::cout das std:: davor auch weglassen.

von

Vielen Dank, ic habe das jetzt verstanden. :-)


Weisst du, im Studium hatten wir gelernt das using namespace nicht zu verwenden. Ich glaube das führt früher oder später zu Problemen. 

Aber ist das STD jetzt einfach für die cout und ggf cin, oder müsste std auch vor der Klasse Car stehen ? 


Alle Funktionen der C++ Standardbibliothek sind im Namensraum "std" definiert. Das heißt, du musst grundsätzlich vor jedes Element der Standardbibliothek ein std:: schreiben, um darauf zugreifen zu können. Durch die Angabe von "using namespace std" im Kopf einer cpp-Datei werden alle Namen von includierten Header-Dateien der Standardbibiliothek, die im Namensraum "std" definiert sind, in dieser cpp-Datei direkt sichtbar. Daher brauchst du dann kein std:: mehr davor zu schreiben.

Das Problem beim Einbinden von "using namespace std" ist, dass du dir eventuell Funktionsnamen, die im Namensraum "std" definiert sind, durch eigene Funktionen (mit gleichem Namen) überschreibst. Du könntest dir z.B. eine eigene printf-Funktion schreiben, die dann die std::printf-Funktion überdeckt. Daher ist es grundsätzlich zu empfehlen, vor Bibliotheksfunktionen immer ein std:: zu setzen, bzw. den Namensraum "std" nicht in eine cpp-Datei einzubetten.

Deine eigenen Klassen haben im Namensraum "std" nichts verloren. Du könntest aber z.B. deine Funktionen alle in einem Namensraum "Limo" definieren und dann mit Limo:: vorne weg aufrufen. Damit verhinderst du, dass deine eigenen Funktionen von anderen "aus Versehen" überdeckt werden.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage sofort und kostenfrei

x
Made by a lovely community
...