Форум программистов, компьютерный форум CyberForum.ru

тип bool ошибка обработки - C++

Восстановить пароль Регистрация
 
freakz
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 01:25     тип bool ошибка обработки #1
при вводе любого значения отличного от 0 или 1 тело в условии выполняется, т.е. введённое число 100 в type генерирует исключение:
C++
1
2
3
4
bool type;
cin>>type;
if(type!=0 && type!=1 || !cin.good())
       {throw "error";}
а в конструкторе структуры он действительно распознает тип как 0=0 и 1=всё отличное от нуля, и при вводе в конструктор,например, type0=100 исключение не срабатывает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct cleat{     //type: 0 = OUTPUT , 1 = INPUT
    bool type;
    int connections;
    char state;
    cleat(bool type0=1, int c0=1, char state0='x'):type(type0),connections(c0),state(state0)
    {
        if(type0!=0 && type0!=1)
           throw "Illegal input for cleat type";
        ...
    }
    
};
хочется сделать тип bool действительно булевым, чтобы в констукторе структуры жестко пресекались попытки записи рода type0=100, при этом оставив тип переменной type как bool.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 01:46     тип bool ошибка обработки #2
Можно как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct cleat{     //type: 0 = OUTPUT , 1 = INPUT
    bool type;
    int connections;
    char state;
    cleat(bool type0 = 1, int c0 = 1, char state0 = 'x') : connections(c0), state(state0)
    {
        if(type0 != 0 && type0 != 1)
           throw "Illegal input for cleat type";
        else if (type0 == 1) type = true;
        type = false;
        ...
    
};
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
28.09.2013, 10:36     тип bool ошибка обработки #3
freakz, вы хотите странного. Это стандартное поведение языка, булев тип имеет только два значения - true и false. Запись bool f = 100 возможна потому, что int приводится к bool. Такое правило - все числа, отличные от нуля, превращаются в true. И если вы булеву переменную сравниваете с числом, то число тоже будет сначала приводиться к bool, а затем эти два булевых значения будут сравниватья. То есть:
C++
1
2
3
4
5
6
bool type = 100;
type == 1;  // истинно
type == 1000; // истинно
type == true; // истинно
type == 0; // ложно
type == false; // ложно
Если вы хотите, чтоб можно было присваивать только true и false (а не 1 и 0 - это целочисленные, а не булевы литералы), то вам нужно пользоваться каким-нибудь другим языком, имхо.
alsav22, вам не кажется, что ваш код не имеет смысла?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.09.2013, 10:43     тип bool ошибка обработки #4
да у вас там cin потом просто портится и cin.good() == false.
почему так - выше уже объяснили. 1 или 0 нужен. возможно при установки флажков всяких начнет хавать "true" и "false".
freakz
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 15:27  [ТС]     тип bool ошибка обработки #5
спасибо, описание типа bool я знаю, просто интересует возможность существования записи такого типа, который будет содержать лишь true или false без приведения int к bool, чтобы этот тип занимал минимум памяти. Почему тогда в конструкторе все кроме нуля - true, а в cin.good пишется false из-за введения числа, отличного от 0 или 1, хотя по логике любое отличное от нуля число должно преобразоваться в true и ввод должен стать успешным???
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 16:29     тип bool ошибка обработки #6
Цитата Сообщение от zenw Посмотреть сообщение
alsav22, вам не кажется, что ваш код не имеет смысла?
Согласен, тупанул, не учёл неявное приведение типов.

Добавлено через 8 минут
Цитата Сообщение от DU Посмотреть сообщение
да у вас там cin потом просто портится и cin.good() == false.
Если там проверку cin убрать, всё равно будет так же работать.

Добавлено через 4 минуты
Тут, возможно, что-то с работой cin связано.

Добавлено через 3 минуты
Т.е., если так написать:
C++
1
2
3
4
5
bool type = 100;
if(type != 0 && type != 1)
{
     throw "error";
}
, то исключения уже не будет.
freakz
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 16:37  [ТС]     тип bool ошибка обработки #7
а мне желательно ограничиться только двумя значениями - ноль или один.Иначе получается, что часть программы, отвечающая за ввод с потока, работает правильно и фильтрует всё, кроме 0 и 1, а другая её часть, отвечающая за заполнение переменной через конструктор, принимает любые целочисленные значения, что есть непорядок. Суть остаётся той же, но пользователь может инициализировать type любым числом, а надо ли это
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 17:26     тип bool ошибка обработки #8
Значения для конструктора откуда берутся? Может где-нибудь раньше отсеивать, до предачи в конструктор?

Добавлено через 44 минуты
Цитата Сообщение от freakz Посмотреть сообщение
чтобы в констукторе структуры жестко пресекались попытки записи рода type0=100, при этом оставив тип переменной type как bool.
Цитата Сообщение от freakz Посмотреть сообщение
чтобы этот тип занимал минимум памяти.
Самое простое решение для этого - передавать в конструктор int. Не знаю только, насколько это подходит для решения общей задачи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct cleat
{     
    bool type;
    int connections;
    char state;
    cleat(int type0 = 1, int c0 = 1, char state0 = 'x') : connections(c0), state(state0)
    {
        if(type0 != 0 && type0 != 1)
           throw "Illegal input for cleat type";
        else if (type0 == 1) type = true;
             else type = false;
    }
 };
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 17:55     тип bool ошибка обработки
Еще ссылки по теме:

C++ Тип bool возвращает 1,а не true
Тип BOOL C++
Можно ли каким-то образом наследовать тип bool C++

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

Или воспользуйтесь поиском по форуму:
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2013, 17:55     тип bool ошибка обработки #9
freakz, а все остальные методы класса cleat будут в итоге выглядить так?
C++
1
2
3
4
5
6
7
8
9
void cleat::foo()
{
  if (type) {
    // ...
  }
  else {
    // ...
  }
}
Может полиморфизмом лучше разрулить?

А по поводу решения int -> bool конверсии, можно сделать небольшую функцию
C++
1
2
3
4
5
6
7
bool int_to_bool(int i_value)
{
  if (i_value < 0 || i_value > 1) {
    throw std::exception("error int to bool");
  }
  return static_cast<bool>(i_value);
}
И вызывать ее везде, где нужно такое преобразование
Yandex
Объявления
28.09.2013, 17:55     тип bool ошибка обработки
Ответ Создать тему
Опции темы

Текущее время: 18:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru