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

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

Войти
Регистрация
Восстановить пароль
 
 
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
#1

Можно ли каким-то образом наследовать тип bool - C++

02.05.2014, 01:27. Просмотров 906. Ответов 21
Метки нет (Все метки)

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

что то в таком роде:
C++
1
class man_woman: public bool

да ток что бы методы cin и cout корректно выводили строки , а не 1 или 0
как в boolalpha
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2014, 01:27     Можно ли каким-то образом наследовать тип bool
Посмотрите здесь:

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

Каким образом можно сделать выключение компютера С++ - C++
Появилась идея сделать интересную программу. Всё уже продумал кроме выключения ПК. То есть каким образом заставить ПК выключится после...

Каким образом можно записать стек и очередь в дек - C++
Прошу помощи. Есть программа создания стека и очереди с динамическим распределением памяти. Каким образом их можно записать в дек?Заранее...

Можно ли в С++ создать матрицу, строки которой имеют разный тип (например, 1-я строка - bool, 2-я - char)? - C++
:p Привет всем. У меня такой вот "тупой" вопрос. Можно ли в С++ создать матрицу например 2 на 8 где первая строка имеет тип bool а вторая...

Массив: каким образом можно изменить размер многомерного массива - C++
Я на 100% уверен что вопрос неоднократно поднимался до меня, поэтому заранее прошу прощения за эту тему.. Я просто ни как не могу найти...

Каким образом можно осуществить загрузку файла из интернета по url ? - C++
Каким образом можно осуществить загрузку файла из интернета по url ? Мне бы хотелось конечно увидеть пример кода готовой программы, но...

Найти площадь самого большого треугольника. Каким образом можно использовать 1 цикл? - C++
Каким образом можно использовать 1 цикл? // Даны 2 массива. Рассматривая пары значений (a1,b1 ; ... ; an,bn) как координаты точек...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6920 / 4113 / 940
Регистрация: 30.01.2014
Сообщений: 6,908
02.05.2014, 02:36     Можно ли каким-то образом наследовать тип bool #2
eXPonent, наследовать можно только class type.
Почему бы просто не определить для этого типа operator>> и operator<<, которые будут выводить то, что нужно?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 06:28     Можно ли каким-то образом наследовать тип bool #3
Если очень хочется впихнуть наследование, то можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
enum class Gender : bool
{
    Woman,
    Man
};
 
std::ostream& operator<<(std::ostream& os, Gender g)
{
    switch (g)
    {
    case Gender::Woman:
        os << "Woman";
        break;
        
    case Gender::Man:
        os << "Man";
        break;
    }
    
    return os;
}
 
 
int main()
{
    std::cout << Gender::Man << std::endl
        << Gender::Woman << std::endl;
        
    return 0;
}
http://ideone.com/O5GAnY

Ну и оператор можно перегрузить для обычного enum. Если C++11 использовать нельзя, а сэкономить на спичках ну очень хочется, у gcc есть флаг short-enums, который заставляет компилятор использовать для перечислений минимально возможный размер. Но тут нужно осторожно - в этом случае все компоненты программы должны быть собраны с этим флагом, чтобы не огрести от разного выравнивания в структурах, например. Стоит ли говорить, что это только добавит головняка.
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 07:57  [ТС]     Можно ли каким-то образом наследовать тип bool #4
DrOffset, как определить такой тип, как экземпляр bool ?

0x10, код
C++
1
2
3
4
5
enum class Gender: bool 
{
    Woman,
    Man
};
(14): error C2332: enum: отсутствует имя тега
(14): error C2236: непредвиденные "class" "Gender". Возможно, отсутствует ";"
(14): error C3381: Gender: спецификаторы доступа к сборке доступны только в коде, скомпилированном с параметром /clr
(15): error C2062: тип "bool" не требуется
(16): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
(18): error C2143: синтаксическая ошибка: отсутствие ";" перед "}"
(18): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 08:04     Можно ли каким-то образом наследовать тип bool #5
eXPonent, именно по этой причине я стараюсь не забывать ссылку на ideone - чтобы было видно, что код рабочий и что необходим компилятор с поддержкой С++11, как видно по ссылке в правом верхнем углу. И ниже специально пояснил.
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 08:13  [ТС]     Можно ли каким-то образом наследовать тип bool #6
как определить такой тип, как экземпляр bool ?
без наследования
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 08:30     Можно ли каким-то образом наследовать тип bool #7
Цитата Сообщение от eXPonent Посмотреть сообщение
как определить такой тип, как экземпляр bool ?
Не понимаю вопроса. Мб Вам нужен оператор приведения к bool в классе? Но учитывая контекст, это странно.
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 08:37  [ТС]     Можно ли каким-то образом наследовать тип bool #8
Нет мне нужно что то вроде точной копии bool
только с перегруженными операторами ввода и вывода
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 08:43     Можно ли каким-то образом наследовать тип bool #9
А обычный enum почему не подходит?
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 08:44  [ТС]     Можно ли каким-то образом наследовать тип bool #10
пишу под стандартом С++10
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 08:46     Можно ли каким-то образом наследовать тип bool #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нет такого стандарта.
Да я же выше написал, что можно enum использовать, а не enum class:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
enum Gender
{
    Woman,
    Man
};
 
std::ostream& operator<<(std::ostream& os, Gender g)
{
    switch (g)
    {
    case Woman:
        os << "Woman";
        break;
        
    case Man:
        os << "Man";
        break;
    }
    
    return os;
}
 
 
int main()
{
    std::cout
        << Man << std::endl
        << Woman << std::endl;
        
    return 0;
}
http://ideone.com/EjTJLZ
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 14:27  [ТС]     Можно ли каким-то образом наследовать тип bool #12
Спасибо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
enum Gender{Woman, Man};
 
istream& operator>>(istream &in, Gender &G)
{
    // тело
    return in;
};
 
ostream& operator<<(ostream &out, Gender G)
{
    G ? out << "Man" : out << "Woman";    
    return out;
};

Как правильно организовать
C++
1
istream& operator>>(istream &in, Gender &G)


Добавлено через 20 минут
Что бы можно была вводить как
Woman и Man
Так и 1 и 0
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 14:40     Можно ли каким-то образом наследовать тип bool #13
Цитата Сообщение от eXPonent Посмотреть сообщение
Как правильно организовать
Это как раз та причина, по которой я не изобретаю свои форматы, а сериализую все в xml/json/boost::serialization.
Нужно парсить содержимое потока. При такой постановке - наверное, посимвольно.

Пример для одного символа: http://www.cplusplus.com/reference/i...istream/unget/

Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 14:54  [ТС]     Можно ли каким-то образом наследовать тип bool #14
А как то можно узнать типу потока которого отправляют?
Или он всё равно идёт посимвольный
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 15:09     Можно ли каким-то образом наследовать тип bool #15
Не понял вопроса.
Какой тип потока?
Иерархия потоков есть тут http://www.cplusplus.com/reference/s.../stringstream/
Содержимое потока - в любом случае байты. Другое дело - как их интерпретировать.
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
02.05.2014, 15:11  [ТС]     Можно ли каким-то образом наследовать тип bool #16
Цитата Сообщение от 0x10 Посмотреть сообщение
Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
Как осуществить операцию положить обратно???
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
02.05.2014, 15:12     Можно ли каким-то образом наследовать тип bool #17
Цитата Сообщение от eXPonent Посмотреть сообщение
Как осуществить операцию положить обратно???
Выше как раз ссылка на этот пример. Еще вариант - http://www.cplusplus.com/reference/i...tream/putback/
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
03.05.2014, 11:13  [ТС]     Можно ли каким-то образом наследовать тип bool #18
Что делать с потоком потом если установить failbit

Добавлено через 21 секунду
???

Добавлено через 7 минут
Как из потока выкинуть символы разделители

Добавлено через 13 часов 16 минут
Как обработать данный оператор с помощью обработчика исключений?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
istream& operator>>(istream &in, Gender &G)
{
    char c;
    do
        c = cin.get();
    while(c == ' ' || c == '\n');
 
    if(c == '0' || c == '1' || c == 'M' || c == 'W')
    {
        if(c == '0' || c == '1') 
        {
            cin.putback(c);
            int t;
            cin >> t;
            if(t == 0 || t == 1)
            {
                if(t == 0)
                    G = Woman;
                if(t == 1)
                    G = Man;
            }
            else
                cout << "Error";
        };
 
        if(c == 'M')
        {
            cin.putback(c);
            string S;
            getline(cin, S);
            if(S == "M" || S == "Man")
                G = Man;
            else
                cout << "Error";
        };
 
        if(c == 'W')
        {
            cin.putback(c);
            string S;
            getline(cin, S);
            if(S == "W" || S == "Woman")
                G = Woman;
            else
                cout << "Error";
        };
    }
    else
    {
        cout << "Error";
    };
 
    return in;
};
что сделать после установки failbit?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
03.05.2014, 11:19     Можно ли каким-то образом наследовать тип bool #19
Страшное дело)
Цитата Сообщение от eXPonent Посмотреть сообщение
Как из потока выкинуть символы разделители
Видимо, посимвольно выгребать. peek + getc.
Цитата Сообщение от eXPonent Посмотреть сообщение
Что делать с потоком потом если установить failbit
Уже ничего. По идее, установка флага ошибки - это последнее действие перед возвратом из функции.
Цитата Сообщение от eXPonent Посмотреть сообщение
Как обработать данный оператор с помощью обработчика исключений?
Просто так функции работы с потоками исключений кидать не будут, это нужно указать явно. Начать читать можно отсюда - http://www.cplusplus.com/reference/ios/ios/exceptions/

Как я уже сказал выше, с продвинутым и правильным во все поля чтением из стандартных потоков мне работать не приходилось, так что мои навыки тут сводятся к чтению документации. Кастую в тред кого-нибудь, кто на этом собаку съел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2014, 12:44     Можно ли каким-то образом наследовать тип bool
Еще ссылки по теме:

Каким образом можно вывести число без знака минус, если оно отрицательное? - C++
Число типа double. Пробовала перевести его в unsіgned double, но, я так понимаю, такой тип не допустим в языке? Или как?

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

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

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

тип bool ошибка обработки - C++
при вводе любого значения отличного от 0 или 1 тело в условии выполняется, т.е. введённое число 100 в type генерирует исключение: bool...


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

Или воспользуйтесь поиском по форуму:
eXPonent
49 / 49 / 2
Регистрация: 21.05.2012
Сообщений: 1,108
03.05.2014, 12:44  [ТС]     Можно ли каким-то образом наследовать тип bool #20
Окончательный вариант:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
istream& operator>>(istream &in, Gender &G)
{
    try
    {
 
        char c;
        do
            c = cin.get();
        while(c == ' ' || c == '\n');
    
        if(c == '0' || c == '1' || c == 'M' || c == 'W')
        {
            if(c == '0' || c == '1') 
            {
                cin.putback(c);
                long long t;
                cin >> t;
                if(t == 0 || t == 1)
                    G = (Gender) t;
                else
                    throw to_string(t);
            };
    
            if(c == 'M' || c == 'W')
            {
                cin.putback(c);
                string S;
                getline(cin, S);
                if(S == "M" || S == "Man" || S == "W" || S == "Woman")
                {
                    if(S == "M" || S == "Man")
                        G = Man;
                    if(S == "W" || S == "Woman")
                        G = Woman;
                }
                else
                    throw S;
            };
 
        }
        else
        {
            cin.putback(c);
            string S;
            getline(cin, S);
            throw S;
        };
 
    }
    catch (string S) 
    {
        cout << "Error reading: " << S << endl << "The input buffer is cleared and Failbit set" << endl;
        // Установить Failbit
    };
 
    return in;
};
Как установить Failbit
Yandex
Объявления
03.05.2014, 12:44     Можно ли каким-то образом наследовать тип bool
Ответ Создать тему
Опции темы

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