8 Stimmen

Wie kann ich eine C++-Standardbibliotheksklassenfunktion überschreiben?

Wie kann ich eine Funktion einer C++-Standardbibliotheksklasse überschreiben? In meiner Anwendung verwende ich ofstream Objekte an vielen verschiedenen Stellen im Code. Und jetzt möchte ich Dateien in einem anderen Berechtigungsmodus in Linux, Ubuntu, öffnen. Aber open Funktion von ofstream hat keinen Parameter zur Angabe des Berechtigungsmodus der erstellten Datei.

Jetzt möchte ich Folgendes überschreiben open() Funktion von ofstream Klasse, so dass sie einen Parameter erhält, um die Berechtigungen für den Benutzerzugriff festzulegen.

5voto

templatetypedef Punkte 343693

Zunächst einmal, um Ihre Terminologie zu klären: Die STL bezieht sich in der Regel auf die Teilmenge der C++-Standardbibliothek, die die Container, Iteratoren und Algorithmen enthält. Die Streams-Klassen sind Teil der C++-Standardbibliothek, werden aber normalerweise nicht mit der STL gebündelt. Einige Puristen werden darauf bestehen, dass es so etwas wie die STL in der C++-Standardbibliothek nicht gibt (da die STL technisch gesehen eine Bibliothek eines Drittanbieters ist, die in den Standard aufgenommen wurde), aber die meisten C++-Programmierer werden wissen, was Sie meinen.

Was Ihre Frage betrifft, so gibt es innerhalb des Standards keine Möglichkeit, Erlaubnismodi mit ofstream . Wenn Sie Ihre eigene benutzerdefinierte Stream-Klasse erstellen möchten, die wie folgt aussieht ofstream aber die Berechtigungen unterstützt, ist es am besten, wie folgt vorzugehen:

  1. Erstellen Sie eine Unterklasse von basic_streambuf die es Ihnen ermöglicht, Dateien zu öffnen, zu schreiben und möglicherweise zu lesen, wobei Sie Unix-Berechtigungen festlegen können. Die Streams-Klassen sind so konzipiert, dass die Details der Kommunikation mit physischen Geräten wie Festplatten, Netzwerken und der Konsole alle von der basic_streambuf Klasse und ihrer abgeleiteten Klassen. 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, die Unterklassen von basic_ostream und installiert Ihre benutzerdefinierte basic_streambuf . Standardmäßig wird die basic_ostream unterstützt alle Standard-Ausgaberoutinen, indem es sie in Form der zugrunde liegenden basic_streambuf Objekt. Sobald Sie Ihren eigenen Stream-Puffer haben, können Sie ein basic_ostream Klasse, die diese streambuf bewirkt, dass alle Standard-Stream-Operationen für diese Klasse (wie << ), um mit den entsprechenden Aufrufen an Ihre streambuf .

Wenn Sie mehr darüber erfahren möchten, finden Sie eine ausgezeichnete Referenz unter Standard C++ IOStreams und Locales . Als schamlose Werbung habe ich die Techniken aus diesem Buch verwendet, um die eine Stream-Klasse, die eine Socket-Verbindung umhüllt . Obwohl ein Großteil des Codes in meinem Stream nicht besonders nützlich sein wird, sollte die Grundstruktur Ihnen den Einstieg erleichtern.

Ich hoffe, das hilft!

1voto

user786653 Punkte 28304

Dies ist keine direkte Antwort auf Ihre Frage, da ich nicht dazu raten würde, die folgenden Punkte außer Kraft zu setzen ofstream::open .

Könnten Sie stattdessen nicht den ersten Vorschlag in este Post? Öffnen Sie die Datei wie gewohnt, um die richtigen Berechtigungen zu erhalten, und erstellen Sie dann eine ofstream aus dem Dateideskriptor.

0voto

marinara Punkte 538
#include <iostream>
#include <fstream>

class gstream: public std::ofstream
{

void open(const std::string& filename, ios_base::openmode mode,int stuff)
        {
                //put stuff here

        }
};

int main() {

        gstream test;
//io stuff
return 0;
}

scheint hier zu funktionieren.

0voto

JohnMcG Punkte 8423

Eine andere Möglichkeit wäre, eine Wrapper-Klasse zu erstellen, die ein "ofstream"-Objekt mit der gewünschten Schnittstelle enthält und die Arbeit an ihr "oftstream"-Mitglied weitergibt. Dies würde wie folgt aussehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X