Как я могу переопределить функцию класса стандартной библиотеки C ++? - PullRequest
8 голосов
/ 03 июля 2011

Как я могу переопределить функцию класса стандартной библиотеки C ++? В моем приложении я использую ofstream объекты в разных местах кода. И теперь я хочу открыть файлы в другом режиме разрешений в Linux, Ubuntu. Но функция open из ofstream не имеет параметра для указания режима разрешения создаваемого ею файла.

Теперь я хочу переопределить open() функцию класса ofstream, чтобы она получала параметр для указания прав доступа пользователя.

Ответы [ 4 ]

5 голосов
/ 04 июля 2011

Для начала, чтобы уточнить вашу терминологию, STL обычно относится к подмножеству стандартной библиотеки C ++, содержащей контейнеры, итераторы и алгоритмы.Классы потоков являются частью стандартной библиотеки C ++, но обычно не связаны вместе с STL.Некоторые пуристы будут настаивать на том, что в стандартной библиотеке C ++ нет такой вещи, как STL (поскольку технически говоря, STL является сторонней библиотекой, которая была принята в стандарт), но большинство программистов на C ++ поймут, что вы имеете в виду.

Что касается вашего вопроса, в стандарте нет способа указать режимы разрешений с помощью ofstream.Если вы хотите создать свой собственный класс потока, например ofstream, но с поддержкой разрешений, лучше всего сделать следующее:

  1. Создать подкласс из basic_streambufэто позволяет вам открывать, записывать и, возможно, читать файлы при указании разрешений Unix.Классы потоков разработаны таким образом, что детали взаимодействия с физическими устройствами, такими как диск, сети и консоль, обрабатываются классом basic_streambuf и его производными классами.Если вы хотите создать свой собственный потоковый класс, реализация потокового буфера будет отличным первым шагом.

  2. Определите свой собственный класс, который подклассов basic_ostream, и установите свой собственный basic_streambuf.По умолчанию basic_ostream поддерживает все стандартные выходные процедуры, реализуя их в терминах базового объекта basic_streambuf.Если у вас есть собственный потоковый буфер, создание класса basic_ostream, который использует этот streambuf, приведет к тому, что все стандартные потоковые операции с этим классом (например, <<) начнут выполнять соответствующие вызовы для вашего streambuf.

Если вам нужна более подробная информация по этому вопросу, отличным справочником будет Стандартные потоки IOS C ++ и локали .Как бесстыдный плагин, я использовал методы из этой книги для создания потокового класса, который обертывает сокетное соединение .Хотя большая часть кода в моем потоке не будет особенно полезна, базовая структура должна помочь вам начать работу.

Надеюсь, это поможет!

1 голос
/ 04 июля 2011

Это не ответ на ваш вопрос напрямую, так как я бы не советовал переопределять ofstream::open.

Вместо этого вы не могли бы использовать первое предложение в этом посте?Откройте файл, как обычно, чтобы получить правильные разрешения, а затем создайте ofstream из дескриптора файла.

0 голосов
/ 04 июля 2011

Другим вариантом может быть создание класса-оболочки, который содержит объект «ofstream» и имеет требуемый интерфейс, и передает работу своему члену «oftstream».Это будет выглядеть следующим образом.

0 голосов
/ 04 июля 2011
#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;
}

, кажется, работает здесь.

...