Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
1

Auto_ptr для хэндлов

19.02.2015, 00:42. Просмотров 922. Ответов 21
Метки нет (Все метки)

Необходимо придумать инструмент для работы с хэндлами файлов (аналог auto_ptr). Может кто-то что-то подобное уже делал?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2015, 00:42
Ответы с готовыми решениями:

Сократить объявление auto_ptr для вновь создаваемого объекта
Кстати, может кто подскажет... - в 3-й строке примера (std::autoptr...) можно...

Auto_ptr
Есть пару простых классов , раньше использовал простые указатели сейчас решил...

Класс auto_ptr
Добрый день. Вот мой вариант реализации: template<class T> class Auto_ptr {...

констанстность auto_ptr
auto_ptr<Nod>/*Nod**/ m_pRoot; void Insert1(auto_ptr<Nod>/*Nod**/ pRoot,...

Передача auto_ptr по ссылке
Передача auto_ptr по ссылке противоречит концепции владения. Нельзя быть...

21
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.02.2015, 00:44 2
RAII что ли : RAII
1
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
19.02.2015, 01:19  [ТС] 3
да, я себе примерно представлял, что это должен быть класс, который будет принимать хендл, а в деструкторе закрывать файл. Только наверно должна быть еще функция get по аналогии с auto_ptr для передачи указателя. Попробую организовать, завтра отпишусь с результатом
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.02.2015, 01:23 4
Правило 15: Предоставляйте доступ к самим ресурсам из управляющих ими классов
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
19.02.2015, 12:46 5
Лучший ответ Сообщение было отмечено IT_Beginner как решение

Решение

Цитата Сообщение от IT_Beginner Посмотреть сообщение
для работы с хэндлами файлов
IT_Beginner, если те что из WinAPI, то что-то типа этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CHandleGuard {
    HANDLE h_;
    CHandleGuard(CHandleGuard&);
    CHandleGuard& operator=(CHandleGuard&);
public:
    explicit CHandleGuard(HANDLE h=INVALID_HANDLE_VALUE) : h_(h) {}
    ~CHandleGuard() { if (h_ != INVALID_HANDLE_VALUE) CloseHandle(h_); }
    HANDLE get() const { return h_; }
    HANDLE release() {
        HANDLE tmp = h_;
        h_ = INVALID_HANDLE_VALUE;
        return tmp;
    }
    void reset(HANDLE h) {
        if (h_ != INVALID_HANDLE_VALUE) CloseHandle(h_);
        h_ = h;
    }
};
1
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
19.02.2015, 12:54 6
schdub, еще имей в виду, что в Win API некоторые невалидные хэндлы действительно INVALID_HANDLE_VALUE, но другие невалидные - NULL. Класс CHandleGuard этого не учитывает, поэтому является примером реализации RAII.
0
schdub
Эксперт С++
3038 / 1380 / 421
Регистрация: 19.01.2009
Сообщений: 3,685
Завершенные тесты: 1
19.02.2015, 13:03 7
Цитата Сообщение от IT_Beginner Посмотреть сообщение
для работы с хэндлами файлов
CheshireCat, у ТС явно указано что хэндлы файлов.
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
19.02.2015, 13:27 8
Тогда вылезает кривизна проектирования класса: он должен называться не CHandleGuard, а CFileHandleGuard.
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
19.02.2015, 14:01 9
Цитата Сообщение от IT_Beginner Посмотреть сообщение
(аналог auto_ptr). Может кто-то что-то подобное уже делал?
Вам критично возможность передавать права владения ресурсом не расшаривая их?

Потому что, если можно расшаривать ресурсы, тогда это уже реализовано в стандартной библиотеке:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//------------------------ API ------------------------//
//выдает ресурс
HANDLE GetHandle();
 
//закрывает ресурс
type CloseHandle(const HANDLE* const );
 
int main()
{
    std::shared_ptr<HANDLE> smart(
 
        GetHandle(), //<--- получение ресурса
 
        CloseHandle  //<--- заданная пользователем функция освобождения ресурса
    );
    
    // когда ресурс станет не нужным, 
    // для его освобождения автоматически вызовется
    // указанная пользователем функция.
}
0
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
19.02.2015, 23:59  [ТС] 10
schdub, честно говоря не совсем представляю что такое WinAPI. Мне нужно сделать какую-то такую обертку, чтоб с хендлами работала. Я так представляю конструктор, который принимает хэндл, деструктор, который закроет файл по окончанию работы с ним, и несколько функций вроде get. Если не трудно, можете рассказать, почему хендл не отнесен в private? С остальным разобрался, спасибо!

Добавлено через 1 минуту
hoggy, Нет, но ведь принцип инкапсуляции никто не отменял?
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
19.02.2015, 23:59 11
Цитата Сообщение от IT_Beginner Посмотреть сообщение
Если не трудно, можете рассказать, почему хендл не отнесен в private?
Отнесен.
0
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
20.02.2015, 00:04  [ТС] 12
DrOffset, все, что за рамками public по умолчанию в private?
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
20.02.2015, 00:06 13
Цитата Сообщение от IT_Beginner Посмотреть сообщение
все, что за рамками public по умолчанию в private?
В классе - да. В структуре - наоборот: все что за рамками private или protected - по умолчанию public.
Так же, для класса наследование по-умолчанию private, для структуры - public.
1
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
20.02.2015, 00:14  [ТС] 14
DrOffset, Спасибо, вроде все понятно, только оно почему-то не собирается. Выдает ошибки LNK2019 и LNK1120. Какие-то неразрешенные внешние элементы
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
20.02.2015, 00:16 15
Цитата Сообщение от IT_Beginner Посмотреть сообщение
почему-то не собирается.
Показывай код, который компилируешь
0
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
20.02.2015, 00:18  [ТС] 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <windows.h>
 
class HandleGuard {
    HANDLE h_;
    HandleGuard(HandleGuard&);
    HandleGuard& operator=(HandleGuard&);
public:
    explicit HandleGuard(HANDLE h = INVALID_HANDLE_VALUE) : h_(h) {}
    ~HandleGuard() {
        if (h_ != INVALID_HANDLE_VALUE)
            CloseHandle(h_); 
    }
    HANDLE get() const {
        return h_; 
    }
    HANDLE release() {
        HANDLE tmp = h_;
        h_ = INVALID_HANDLE_VALUE;
        return tmp;
    }
    void reset(HANDLE h) {
        if (h_ != INVALID_HANDLE_VALUE) 
            CloseHandle(h_);
        h_ = h;
    }
};
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
20.02.2015, 00:32 17
IT_Beginner, конкретно этот код нормально собирается (VS2013, если что).
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
20.02.2015, 00:34 18
Цитата Сообщение от IT_Beginner Посмотреть сообщение
hoggy, Нет, но ведь принцип инкапсуляции никто не отменял?
Тогда не нужно городить велосипедов.
Используйте std::shared_ptr.

Инкапсуляцию он не нарушает.
0
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
20.02.2015, 00:52  [ТС] 19
тоже 13я студия... ну тогде даже не знаю, хотел как-то потестить при работе с хендлом..

Добавлено через 17 минут
во, еще вопрос. А где тут реализация оператора присваивания? Объявление есть, а реализации...
0
DrOffset
8464 / 4741 / 1161
Регистрация: 30.01.2014
Сообщений: 7,727
20.02.2015, 11:41 20
Цитата Сообщение от IT_Beginner Посмотреть сообщение
во, еще вопрос. А где тут реализация оператора присваивания? Объявление есть, а реализации...
Объявление приватное. Реализации нет. Это паттерн такой (в С++03), для запрета копирования и присваивания. Иными словами, объект этого класса нельзя копировать или присваивать.
0
20.02.2015, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2015, 11:41

Отличие get() и release() у auto_ptr
Вопрос,конечно,глупой. Но не могу разобраться. В чём всё таки различение между ...

Как использовать auto_ptr?
Ищу, ищу, но нигде не могу найти на русском, да и на буржуйском, толковое...

Листинг хэндлов всех окон процесса
Всем привет, такой вопрос: Вот так получаю хэндл процесса Process myproc =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru