====== Initialisierung eines Objekts bei dessen Deklaration ======
Bei der Deklaration eines Objekts mit gleichzeitiger Initialisierung kommt gelegentlich (zumindest beim Kompilieren mit GCC) zu den (auf den ersten Blick) seltsamen Fehlermeldungen.
Ein Beispiel:
void eine_klasse::eine_methode(const string& filepath)
{
auto file = std::ofstream(filepath, std::ios_base::trunc);
file << "Hier wird irgendwas in das File geschrieben...";
file << std::endl;
}
Hier wird das Objekt **file** deklariert und gleich durch den Konstruktor //ofstream(const string& filename, ios_base::openmode mode = ios_base::out)// (C++11) initialisiert. Der GNU-Compiler erzeugt dabei ein temporäres Objekt und ruft anschließend den Copy-Constructor //ofstream(const ofstream&)// des zu erzeugendes Objekts auf. Der ist jedoch in der STL als **deleted** definiert (Quelle: [[http://www.cplusplus.com/reference/fstream/ofstream/ofstream/]]):
// default (1)
ofstream();
// initialization (2)
explicit ofstream (const char* filename, ios_base::openmode mode = ios_base::out);
explicit ofstream (const string& filename, ios_base::openmode mode = ios_base::out);
// copy (3)
ofstream (const ofstream&) = delete;
// move (4)
ofstream (ofstream&& x);
Der Compiler beschwert sich dabei:
ein_file.cpp: In member function 'void eine_klasse::eine_methode(const string&)':
ein_file.cpp:127:69: error: use of deleted function 'std::basic_ofstream::basic_ofstream(const std::basic_ofstream&)'
auto file = std::ofstream(filepath, std::ios_base::trunc);
^
Beim genaueren Hinsehen fällt auf, dass die als //deleted// angegebene Funktion nicht die ist, die man erwartet (s. die nächste Zeile).
Abhilfe schafft man, wenn man explizit den Konstruktor des zu erzeugendes Objekts aufruft:
void eine_klasse::eine_methode(const string& filepath)
{
std::ofstream file(filepath, std::ios_base::trunc);
}
----
Stand: 29.02.2016\\
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF