Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wieso klappt hier kein Call-by-Reference?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.08.2009, 14:55 Uhr
~brettvormkopf
Gast


Moin!

folgender Code:

C++:
#include <iostream>

class Auto {
private:
  const char* modell;

public:
  Auto(const char* modell) {
    this->modell = modell;
  }

  void printModell() {
    std::cout<<"tut Modell "<<modell<<std::endl;
  }
};

class Garage {
private:
  const char* name;

public:
  Garage(const char* name) {
    this->name = name;
  }

  void parkeAuto(Auto& a) {
    std::cout<<"Garage "<<name<<":";
    a.printModell();
  }
};


int main() {
  Garage g = Garage("Meine Garage");
  g.parkeAuto(Auto("Audi A5")); // error: no matching function call to 'Garage::parkeAuto(Auto)'
  return 0;
}



Wie im Kommentar angedeutet schmeißt der Compiler in der zweiten Zeile der main() die Fehlermeldung:
In function ‘int main()’:
35: error: no matching function for call to ‘Garage::parkeAuto(Auto)’
26: note: candidates are: void Garage::parkeAuto(Auto&

Ich verstehe aber nicht, warum. Ich möchte halt das Auto per Referenz annehmen in der Garage... starre jetzt seit 10 Min darauf und finde den Fehler nicht
Kann mir jemand einen Tipp geben?

Dieser Post wurde am 12.08.2009 um 15:47 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.08.2009, 14:58 Uhr
~brettvormkopf
Gast


Ups, hab mich bei den Tags vertan, sorry. Hier noch mal vernünftig formatierter Code; den oberen Post editieren kann ich leider nicht:

http://pastebin.com/m4afc9464
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.08.2009, 15:57 Uhr
0xdeadbeef
Gott
(Operator)


Temporäre Objekte können nicht als variable Referenz gebunden werden. Was geht, ist

C++:
void parkeAuto(Auto const &a) {


und in der Auto-Klasse entsprechend

C++:
void printModell() const {


damit printModell mit einem konstanten Objekt aufgerufen werden kann.

Oder du könntest in der main

C++:
Auto a("Audi A5")
g.parkeAuto(a);


schreiben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 12.08.2009 um 15:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.08.2009, 16:42 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


weil du keine Variable anlegst von der er eine Referenz erzeugen kann.

also:


C++:
Auto audia5("Audi A5");
g.parkeAuto(audia5);



sollte funktionieren
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.08.2009, 18:22 Uhr
~brettvormkopf
Gast



Zitat von 0xdeadbeef:
Temporäre Objekte können nicht als variable Referenz gebunden werden. Was geht, ist

C++:
void parkeAuto(Auto const &a) {


und in der Auto-Klasse entsprechend

C++:
void printModell() const {


damit printModell mit einem konstanten Objekt aufgerufen werden kann.



Alles klar, danke! Wusste gar nicht, dass const auch bei sowas Auswirkungen haben kann. Da ich meine Objekte const machen kann, habe ich es natürlich so gelöst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.08.2009, 08:38 Uhr
~David_pb
Gast


Was auch funktioniert, einfach per Wert übergabe:


C++:
void parkeAuto(Auto a) {
    std::cout<<"Garage "<<name<<":";
    a.printModell();
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.08.2009, 10:06 Uhr
ao

(Operator)



Zitat von ~David_pb:
Was auch funktioniert, einfach per Wert übergabe:


Toller Vorschlag.

Deine Garage parkt nicht das übergebene Auto, sondern sie kopiert es und parkt die Kopie, und das echte Auto bleibt in der Einfahrt stehen. Es macht direkt Spaß, sich die Konsequenzen auszumalen, die entstehen, wenn der Besitzer zurückkommt und wegfahren will.

Sorry für Sarkasmus, aber das ist ein typischer Fall von "Nicht bis zum Ende gedacht". Nicht alles, was vom Compiler akzeptiert wird, ist ein sinnvolles Programm. Das merkt man hoffentlich, sobald das Programm mehr tut als "Audi A5" speichern und ähnlichen Trivialkram.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.08.2009, 10:37 Uhr
~David_pb
Gast


Wieso? Er übergibt doch ein rvalue, die meisten Compiler optimieren das und es wird garnichts kopiert. Das Problem tritt dann auf wenn er lvalues übergeben will. :p Zugegeben zieht er aber nur den Vorteil daraus das er so die fehlende const-Korrektheit umgehen kann (ohne intern eine Kopie zu erstellen, dann wäre pass-by-value auf jeden Fall die bessere Wahl).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.08.2009, 10:51 Uhr
ao

(Operator)



Zitat von ~David_pb:
Wieso? Er übergibt doch ein rvalue, die meisten Compiler optimieren das und es wird garnichts kopiert.

Was bringt dich zu dieser Aussage? Ein Compiler, der das wagt, ist irgendwas, aber kein C++.

Pass-by-value kopiert *immer*. Änderungen an der inneren (kopierten) Instanz haben *niemals* Auswirkungen auf die äußere Original-Instanz. Das ist eine eiserne Regel, die auch in der höchsten Optimierungsstufe nicht verletzt werden darf.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.08.2009, 11:09 Uhr
~David_pb
Gast



Zitat:

Was bringt dich zu dieser Aussage? Ein Compiler, der das wagt, ist irgendwas, aber kein C++.


Es gibt Dinge die ein Compiler tun kann und die trotzdem Standardkonform sind...


Zitat:

Pass-by-value kopiert *immer*. Änderungen an der inneren (kopierten) Instanz haben *niemals* Auswirkungen auf die äußere Original-Instanz. Das ist eine eiserne Regel, die auch in der höchsten Optimierungsstufe nicht verletzt werden darf.


Das stimmt, Änderungen die in der Funktion/Methode vorgenommen werden wirken sich nicht auf die Orginal-Instanz aus, daher wird eine Kopie erzeugt _die_ geändert werden darf (was bei const Referenzen nicht funktioniert). Allerdings erlaubt der Standard es, im Fall von rvalues, dass das Orginalobjekt übernommen- und somit die Kopie eingespart wird. Die Optimierung nennt sich copy elision und wird von allen aktuellen Compilern unterstützt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: