Referenz: conversion from 'Foo*' to non-scalar type 'Foo' requestet

ArcVieh

Grünschnabel
Hallo,


ich hab da wieder mal ein kleines Problem.
Diesmal geht es darum, dass ich einen Parameter (Referenz) in einen Kopier-Konstruktor übergeben möchte, der ebenfalls eine Referenz übergibt bekommt.


Nur irgendwie bekomme ich folgende Fehlermeldung:
Code:
conversion from 'Foo*' to non-scalar type 'Foo' requestet


Folgenden Code habe ich:
C++:
Foo& Foo::operator<<(const Bar &a) {
    Bar s = new Bar(a);

    return *this;
}
C++:
Bar::Bar(const Bar &f) {
    /* Rufe eigenen Default-Konstruktor auf,
       um mit Defaultwerten zu initialisieren */
    Bar();

    this->xyz = f.xyz;
}


Die Prototypen passen.



Was mache ich falsch?

Danke im Voraus!



Grüße,
ArcVieh
 
Hupalla, der Fehler liegt ganz wo anders... Ich hab den Zeigerstern vergessen.

C++:
Bar * s = new Bar();
 
C++:
Bar::Bar(const Bar &f) {
    /* Rufe eigenen Default-Konstruktor auf,
       um mit Defaultwerten zu initialisieren */
    Bar();

    this->xyz = f.xyz;
}
Der Code macht nicht das, was im Kommentar steht. Bar(); erstellt lediglich ein temporäres Objekt der Klasse Bar und räumt dieses sofort wieder auf. Auf die aktuelle Instanz hat das keine Auswirkungen, die Variablen bleiben trotzdem sämtlich uninitialisiert.

Hupalla, der Fehler liegt ganz wo anders... Ich hab den Zeigerstern vergessen.

C++:
Bar * s = new Bar();
Das ist aber im Kontext des gegebenen Codes trotzdem mit hoher Wahrscheinlichkeit ein Speicherleck.

Grüße,
Matthias
 
Der Code macht nicht das, was im Kommentar steht. Bar(); erstellt lediglich ein temporäres Objekt der Klasse Bar und räumt dieses sofort wieder auf. Auf die aktuelle Instanz hat das keine Auswirkungen, die Variablen bleiben trotzdem sämtlich uninitialisiert.

Vielen Dank! Ich habe diese Art und Weise deswegen angewandt, da sie in Java durchaus geht, bzw. mein damaliger Prof empfahl es so.
 
Hi.
Vielen Dank! Ich habe diese Art und Weise deswegen angewandt, da sie in Java durchaus geht, bzw. mein damaliger Prof empfahl es so.
C++ ist aber nicht Java.

Wie es Scott Meyers ausdrückt: ".. [Other] languages zig, while C++ zags" ;)

Bis C++11 gibt es in C++ keine Möglichkeit von einem Konstruktor einen anderen Konstruktor aufzurufen.

In C++11 gibt es nun diese Möglichkeit, es funktioniert aber nicht so wie du es versucht hast.
C++:
class A {
public:
  A(int x) {}

  A() : A(3) /* anderen Konstruktor aufrufen */ {}
};
\edit: Wenn du keinen C++11 Compiler verwendest, kannst du nur eine private init Methode schreiben, die du dann von allen Konstruktoren aus aufrufst.

Gruß
 
Zurück