Wie kann ich eine Klassenfunktion der C ++ - Standardbibliothek überschreiben?

8

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.

    
korhan 03.07.2011, 19:57
quelle

4 Antworten

5

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:

  1. 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.

  2. 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!

    
templatetypedef 03.07.2011 20:05
quelle
1

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.

    
user786653 03.07.2011 20:05
quelle
0
%Vor%

scheint hier zu funktionieren.

    
marinara 03.07.2011 21:16
quelle
0

Eine andere Option wäre, eine Wrapper-Klasse zu erstellen, die ein 'ofstream' -Objekt enthält und über die gewünschte Schnittstelle verfügt, und die Arbeit an ihr 'Oftstream' -Member weitergibt. Es würde so aussehen.

    
JohnMcG 03.07.2011 21:23
quelle

Tags und Links