Wie kann ich eine C ++ - Standardbibliotheksklassenfunktion überschreiben? In meiner Anwendung verwende ich ofstream
Objekte an vielen verschiedenen Stellen des Codes. Und jetzt möchte ich Dateien in einem anderen Berechtigungsmodus in Linux, Ubuntu öffnen. Aber die Funktion open
von ofstream
hat keinen Parameter, um den Berechtigungsmodus der von ihr erstellten Datei anzugeben.
Jetzt möchte ich open()
function von ofstream
class überschreiben, damit es einen Parameter erhält, der die Berechtigungen für den Benutzerzugriff angibt.
Zunächst einmal bezieht sich die STL normalerweise auf die Teilmenge der C ++ - Standardbibliothek, die die Container, Iteratoren und Algorithmen enthält, um Ihre Terminologie zu verdeutlichen. Die Stream-Klassen sind Teil der C ++ - Standardbibliothek, werden aber normalerweise nicht zusammen mit der STL gebündelt. Einige Puristen bestehen darauf, dass es keine STL in der C ++ - Standardbibliothek gibt (da die STL technisch gesehen eine Bibliothek eines Drittanbieters ist, die in den Standard übernommen wurde), aber die meisten C ++ - Programmierer wissen, was Sie meinen.
Wie bei Ihrer Frage gibt es im Standard keine Möglichkeit, Berechtigungsmodi mit ofstream
anzugeben. Wenn Sie Ihre eigene benutzerdefinierte Stream-Klasse erstellen möchten, die wie ofstream
ist, aber Berechtigungen unterstützt, sollten Sie Folgendes tun:
Erstellen Sie eine Unterklasse von basic_streambuf
, mit der Sie Dateien öffnen, schreiben und möglicherweise lesen können, während Sie Unix-Berechtigungen angeben. Die Stream-Klassen sind so konzipiert, dass die Details der Kommunikation mit physischen Geräten wie Festplatte, Netzwerken und der Konsole alle von der Klasse basic_streambuf
und ihren abgeleiteten Klassen behandelt werden. Wenn Sie Ihre eigene Stream-Klasse erstellen möchten, wäre die Implementierung eines Stream-Puffers ein ausgezeichneter erster Schritt.
Definieren Sie Ihre eigene Klasse für die Unterklassen basic_ostream
und installieren Sie Ihre benutzerdefinierte basic_streambuf
. Standardmäßig unterstützt basic_ostream
alle Standardausgaberoutinen, indem sie in Bezug auf das zugrunde liegende Objekt basic_streambuf
implementiert werden. Sobald Sie Ihren eigenen Strompuffer haben, wird der Aufbau einer Klasse basic_ostream
, die diese streambuf
verwendet, dazu führen, dass alle Standard-Stream-Operationen für diese Klasse (wie <<
) die entsprechenden Aufrufe an Ihre streambuf
ausführen.
Wenn Sie mehr Details dazu wünschen, ist C ++ IOS-Streams und Locales eine ausgezeichnete Referenz. Als schamloser Plug habe ich die Techniken aus diesem Buch verwendet, um eine Stream-Klasse zu erstellen, die eine Socket-Verbindung umschließt . Während ein großer Teil des Codes in meinem Stream nicht besonders nützlich ist, sollte die grundlegende Struktur Ihnen den Einstieg erleichtern.
Hoffe, das hilft!
Dies beantwortet Ihre Frage nicht direkt, da ich nicht empfehlen würde, ofstream::open
zu überschreiben.
Stattdessen könntest du den ersten Vorschlag nicht in diesem Beitrag verwenden? Öffnen Sie die Datei wie gewohnt, um die richtigen Berechtigungen zu erhalten, und erstellen Sie dann einen ofstream
aus dem Dateideskriptor.
Tags und Links c++ inheritance iostream