2012-05-19 1 views
0

В моей программе на C++ много указателей на файлы и есть много операторов возврата.
Чтобы избежать выполнения инструкции return, не закрывая все открытые указатели файлов, я написал этот класс, исходя из предположения, что мне гарантировано, что все деструкторы объектов автоматически вызываются при достижении оператора return.

Является ли мое предположение истинным?
И хороший код?

класс File_pointer - это хороший C++?

Конструктор и деструктор в File_pointer.cpp

File_pointer::File_pointer(string filename) 
{ 
    fptr.open(filename.c_str()); 
}; 

File_pointer::~File_pointer() 
{ 
    fptr.close(); 
}; 



Пример реализации

int main() 
{ 
    File_pointer myfile("myfile.txt"); 
    int x = 2; 
    switch(x) 
    { 
     case 1:  return x; 
     case 2:  return x; 
     default: 
      break; 
    }; 

return 0; 

} 
+1

Какой тип 'fptr'? Для указателей FILE в стиле C вы можете использовать 'unique_ptr' (http://codereview.stackexchange.com/q/4679), поэтому вам не нужно изобретать колесо. Для C++ iostreams вам даже не нужно ничего делать *. –

+1

Стоит посмотреть [это видео] (http://www.youtube.com/watch?v=OB-bdWKwXsU), особенно с 0:27:30, часть ** Ресурсы и ошибки **. Он отвечает на ваш вопрос – LihO

+0

Спасибо за ответы. Видео закладок ... @KerrekSB Я думал, что перед выходом из программы я всегда должен называть close() для любого указателя, способного писать в файл, или неприятные вещи.Это правда вообще, или я просто трачу свое время на обеспечение этого? – user1361521

ответ

3

Т его правда?

Да; все объекты с automatic storage duration имеют свои деструкторы, когда они выходят за рамки.

Для уточнения, автоматический объект - нестатический локальный объект, который не был динамически распределен.

И хороший код?

Это субъективно. Но то, что я скажу, заключается в том, что полагаться на определение области для автоматического вызова деструкторов - очень распространенный идиом C++, известный странным именем resource acquisition is initialisation (RAII).

Классы, подобные std::ofstream, уже используют RAII; их деструктор автоматически закрывает файл. Например, если ваш fptr - это std::ofstream, то ваш класс-оболочка совершенно лишний.

+0

В C++ нет «динамических переменных». Все переменные являются локальными или статическими. Только * объекты * могут быть динамическими. (Поэтому, например, вы не можете иметь «динамическую ссылку»: ссылки никогда не являются объектами.) –

+0

@KerrekSB: справедливая точка; "variable" -> "object". –

0

RAII, обязательно.

Или используйте специальные интеллектуальные указатели, если можете, до wrap resources. Всегда лучше тестироваться, чем все, что вы делаете сами, но просты.

0

я полагаю, что fptr является FILE указателем в вашем File_pointer классе

Хотя ваш подход близок к тому, что RAII парадигма, я должен указать, что вы не обрабатываете ошибки надлежащим образом.

например. Что делать, если fopen не удается?

+0

Если 'fptr' был' FILE * ', вы не могли бы называть' fptr.open ("") ' –

 Смежные вопросы

  • Нет связанных вопросов^_^