Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Не вызывается деструктор у класса

#cpp #locale


Доброго времени суток. Имеется класс, который изменяет кодировку консоли. Код:

#include "stdafx.h"
#include 
#include 

class edit_locale
{
    int old_cin;
    int old_cout;
public:
   edit_locale(int);
   ~edit_locale();
};

int main()
{
    edit_locale(1251);
    std::cout << "Иван" << std::endl;

   return 0;
}


edit_locale::edit_locale(int cp)
{
   this->old_cin = GetConsoleCP();
   this->old_cout = GetConsoleOutputCP();
   SetConsoleCP(cp);
   SetConsoleOutputCP(cp);
}

edit_locale::~edit_locale()
{
   SetConsoleCP(this->old_cin);
   SetConsoleOutputCP(this->old_cout);
}


Проблема заключается в следующем: функция SetConsole срабатывает только в конструкторе,
в main - функции изменений не происходит. И деструктор не вызывается. С чем это может
быть связано? Спасибо.
    


Ответы

Ответ 1



Проблема в строчке edit_locale(1251); Вы создаёте временный объект, который тут же, в этой же строчке уничтожается. Пишите так: edit_locale l(1251);

Ответ 2



Попробуйте создать объект :) int main() { edit_locale el(1251); std::cout << "Иван" << std::endl; return 0; } Без этого в main() создается (и тут же, до вывода строки) уничтожается временный объект. Чтоб было понятнее - #include class test { public: test() { std::cout << "ctor\n"; } ~test() { std::cout << "dtor\n"; } }; void f() { test(); std::cout << "in f\n"; } void g() { test t; std::cout << "in g\n"; } int main() { std::cout << "call f()\n"; f(); std::cout << "call g()\n"; g(); } Update Можно обойтись и временным объектом - если поступить так: #include #include class edit_locale { int old_cin; int old_cout; public: template edit_locale(int,T f); ~edit_locale(); }; int main() { edit_locale{1251,[](){ std::cout << "Иван" << std::endl; }}; return 0; } template edit_locale::edit_locale(int cp, T f) { this->old_cin = GetConsoleCP(); this->old_cout = GetConsoleOutputCP(); SetConsoleCP(cp); SetConsoleOutputCP(cp); f(); }; edit_locale::~edit_locale() { SetConsoleCP(this->old_cin); SetConsoleOutputCP(this->old_cout); } Кстати, мне всегда хотелось в C++ иметь возможность для всяких lock'ов и иже с ними писать не { lock lk; // что-то делаем } а lock{ // что-то делаем } Так, по-моему, выглядит понятнее. С лямбдами имеем определенный суррогат...

Комментариев нет:

Отправить комментарий