C++11 deleted function - wie Referenz kopieren?

musv

Aktiver NGBler
Registriert
15 Juli 2013
Beiträge
3.145
Ort
/dev/null
Es geht um .

Ich hab hier mal ein Snippet zusammengeschustert, was ich so ähnlich in einem größeren Projekt verwende.

[src=cpp]
#include <fstream>

class Delfunc {
public:
Delfunc(std::ifstream &is);
private:
std::ifstream is_;
};

Delfunc::Delfunc(std::ifstream &is) {
is_ = is;
}

int main() {
return 0;
}[/src]

Beim Compilieren krieg ich dann folgenden Fehler
Code:
Expand Collapse Copy
 g++ -std=c++11 -o delfunc main.cpp 
main.cpp: In Konstruktor »Delfunc::Delfunc(std::ifstream&)«:
main.cpp:11:9: Fehler: gelöschte Funktion »std::basic_ifstream<char>& std::basic_ifstream<char>::operator=(const std::basic_ifstream<char>&)« wird verwendet
     is_ = is;

Die Erklärung:
Bei ifstream wurde der Copy Constructor gelöscht, damit man durch falsche Übergabe nicht auf leere Objekte versucht zuzugreifen (so oder irgendwie). Aus dem Grund soll / kann man solche Objekte nur als Referenzen übergeben. Mit dem übergebenen Wert is im Konstruktor kann ich auch noch prima arbeiten. Nur krieg ich die Referenz nicht in die Membervariable is_ rein, um den ifstream noch in weiteren Funktionen nutzen zu können.

Wie mach ich das?
 
Hab ich jetz nen Denkfehler durch zu viel Bier, oder versuchst du die Adresse von is in einen std::ifstream zu schieben?
 
  • Thread Starter Thread Starter
  • #3
Deinen Bierkonsum kenn ich nicht. :beer:

Ich versuche eigentlich, die Referenz in die Membervariable zu kopieren.

Hab mir dann gestern erklären lassen, dass man das mit c++11 jetzt besser per erledigt. Dumm ist dabei nur, dass gcc das bei noch nicht unterstützt.
 
Eine Möglichkeit wäre, den Stream auch nur als Referenz zu halten:
[src=cpp]#include <fstream>

class Delfunc {
public:
Delfunc(std::ifstream &is);
private:
std::ifstream& is_;
};

Delfunc::Delfunc(std::ifstream &is):
is_(is)
{}

int main() {
return 0;
}[/src]
Hat nur den Nachteil, dass der rufende Kontext das Ressourcenmanagement für das Streamobjekt macht. Es muss dann sichergestellt sein, dass der Stream mindestens solang lebt wie das Delfunc-Objekt.

Wer soll/muss denn das Streamobjekt managen? Wenn Delfunc, wäre ein Move eigentlich schon das richtige Vorgehen.
 
Zurück
Oben