Доброго времени суток. Имеется класс, который изменяет кодировку консоли. Код:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
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 - функции изменений не происходит. И деструктор не вызывается. С чем это может быть связано? Спасибо.
Проблема в строчке
edit_locale(1251);
Вы создаёте временный объект, который тут же, в этой же строчке уничтожается.
Пишите так:
edit_locale l(1251);
Попробуйте создать объект :)
int main()
{
edit_locale el(1251);
std::cout << "Иван" << std::endl;
return 0;
}
Без этого в main()
создается (и тут же, до вывода строки) уничтожается временный объект.
Чтоб было понятнее -
#include <iostream>
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 <iostream>
#include <Windows.h>
class edit_locale
{
int old_cin;
int old_cout;
public:
template<typename T>
edit_locale(int,T f);
~edit_locale();
};
int main()
{
edit_locale{1251,[](){
std::cout << "Иван" << std::endl;
}};
return 0;
}
template<typename T>
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{
// что-то делаем
}
Так, по-моему, выглядит понятнее. С лямбдами имеем определенный суррогат...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На собеседовании меня спросили про опыт работы программистом в авиационной сфереЯ сказал, что написал на Qt (С++) программу расчета траектории...
Главная проблема - не работает flexslider - поставил JQuery update, как советуют, но это не помогает