Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
freakz
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
#1

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

28.09.2013, 01:25. Просмотров 641. Ответов 8
Метки нет (Все метки)

при вводе любого значения отличного от 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 01:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Тип bool, ошибка обработки (C++):

как правильно понять тип bool ? bool true(const string &str) и что дает это значение ? - C++
задам может глупый вопрос, но прошу ответить. как правильно понять тип bool ? bool true(const string &str) и что дает это...

Тип bool, для чего нужен, как работает? - C++
Может кто-нибудь поможет на простейшем но понятном примере объяснить как работает тип bool. Знаю что это тип может быть ложный или истинный...

Тип BOOL - C++
Что API функции возвращают в качестве TRUE? 1? Или любой не 0?

Тип bool возвращает 1,а не true - C++
Задание: Даны числа A, B, C (число A не равно 0). Рассмотрев дискриминант D = B2 − 4·A·C, вернуть значение true, если квадратное...

Почему компилятор не понимает тип bool? - C++
#include <stdio.h> #include <iostream .h> #include <fstream.h> #include <iomanip.h> #include <math.h> #include <string.h> ...

Обработка ошибок cin (тип bool) - C++
Доброго времени суток. Собственно, проблема. Надо поймать все ошибки при вводе в тип bool: буквы, ентеры, пробелы, цифры, отличные от 0 и...

8
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 01:46 #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;
        ...
    
};
0
zenw
154 / 110 / 3
Регистрация: 12.06.2013
Сообщений: 168
28.09.2013, 10:36 #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, вам не кажется, что ваш код не имеет смысла?
1
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.09.2013, 10:43 #4
да у вас там cin потом просто портится и cin.good() == false.
почему так - выше уже объяснили. 1 или 0 нужен. возможно при установки флажков всяких начнет хавать "true" и "false".
0
freakz
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 15:27  [ТС] #5
спасибо, описание типа bool я знаю, просто интересует возможность существования записи такого типа, который будет содержать лишь true или false без приведения int к bool, чтобы этот тип занимал минимум памяти. Почему тогда в конструкторе все кроме нуля - true, а в cin.good пишется false из-за введения числа, отличного от 0 или 1, хотя по логике любое отличное от нуля число должно преобразоваться в true и ввод должен стать успешным???
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 16:29 #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";
}
, то исключения уже не будет.
0
freakz
2 / 2 / 0
Регистрация: 25.09.2011
Сообщений: 22
28.09.2013, 16:37  [ТС] #7
а мне желательно ограничиться только двумя значениями - ноль или один.Иначе получается, что часть программы, отвечающая за ввод с потока, работает правильно и фильтрует всё, кроме 0 и 1, а другая её часть, отвечающая за заполнение переменной через конструктор, принимает любые целочисленные значения, что есть непорядок. Суть остаётся той же, но пользователь может инициализировать type любым числом, а надо ли это
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2013, 17:26 #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;
    }
 };
1
I.M.
566 / 549 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2013, 17:55 #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);
}
И вызывать ее везде, где нужно такое преобразование
1
28.09.2013, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 17:55
Привет! Вот еще темы с ответами:

Можно ли каким-то образом наследовать тип bool - C++
Здраствуйте, можно ли каким то образом наследовать тип bool типо что бы 1 - man типо что бы 0 - woman что то в таком роде: class...

Можно ли сделать бесконечный цикл с while, используя тип bool? - C++
... bool f; f=false; while(f=false) { ... ... ... if(....)//какое-то условие f=true;//цикл прерывается

error C3168: bool: недопустимый базовый тип для перечисляемого типа - C++
В Visual C++ 2005 это не вызывает ошибки. А почему в Visual C++ 2010 ошибка? enum State:bool{ON=true, OFF=false}; // error C3168:...

не работает bool xor(bool a, bool b) - C++
Учусь по &quot;Базовому курсу&quot; Герберта Шилда #include &lt;iostream&gt; bool xor(bool a, bool d); int main() { bool p, q; cout...


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

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

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