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

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

Восстановить пароль Регистрация
 
 
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
02.05.2014, 01:27     Можно ли каким-то образом наследовать тип bool #1
Здраствуйте, можно ли каким то образом наследовать тип bool
типо что бы 1 - man
типо что бы 0 - woman

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

да ток что бы методы cin и cout корректно выводили строки , а не 1 или 0
как в boolalpha
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
02.05.2014, 02:36     Можно ли каким-то образом наследовать тип bool #2
eXPonent, наследовать можно только class type.
Почему бы просто не определить для этого типа operator>> и operator<<, которые будут выводить то, что нужно?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.05.2014, 08:04     Можно ли каким-то образом наследовать тип bool #5
eXPonent, именно по этой причине я стараюсь не забывать ссылку на ideone - чтобы было видно, что код рабочий и что необходим компилятор с поддержкой С++11, как видно по ссылке в правом верхнем углу. И ниже специально пояснил.
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
02.05.2014, 08:13  [ТС]     Можно ли каким-то образом наследовать тип bool #6
как определить такой тип, как экземпляр bool ?
без наследования
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.05.2014, 08:30     Можно ли каким-то образом наследовать тип bool #7
Цитата Сообщение от eXPonent Посмотреть сообщение
как определить такой тип, как экземпляр bool ?
Не понимаю вопроса. Мб Вам нужен оператор приведения к bool в классе? Но учитывая контекст, это странно.
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
02.05.2014, 08:37  [ТС]     Можно ли каким-то образом наследовать тип bool #8
Нет мне нужно что то вроде точной копии bool
только с перегруженными операторами ввода и вывода
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.05.2014, 08:43     Можно ли каким-то образом наследовать тип bool #9
А обычный enum почему не подходит?
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
02.05.2014, 08:44  [ТС]     Можно ли каким-то образом наследовать тип bool #10
пишу под стандартом С++10
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.05.2014, 14:40     Можно ли каким-то образом наследовать тип bool #13
Цитата Сообщение от eXPonent Посмотреть сообщение
Как правильно организовать
Это как раз та причина, по которой я не изобретаю свои форматы, а сериализую все в xml/json/boost::serialization.
Нужно парсить содержимое потока. При такой постановке - наверное, посимвольно.

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

Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
02.05.2014, 14:54  [ТС]     Можно ли каким-то образом наследовать тип bool #14
А как то можно узнать типу потока которого отправляют?
Или он всё равно идёт посимвольный
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.05.2014, 15:09     Можно ли каким-то образом наследовать тип bool #15
Не понял вопроса.
Какой тип потока?
Иерархия потоков есть тут http://www.cplusplus.com/reference/s.../stringstream/
Содержимое потока - в любом случае байты. Другое дело - как их интерпретировать.
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
02.05.2014, 15:11  [ТС]     Можно ли каким-то образом наследовать тип bool #16
Цитата Сообщение от 0x10 Посмотреть сообщение
Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
Как осуществить операцию положить обратно???
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.05.2014, 15:12     Можно ли каким-то образом наследовать тип bool #17
Цитата Сообщение от eXPonent Посмотреть сообщение
Как осуществить операцию положить обратно???
Выше как раз ссылка на этот пример. Еще вариант - http://www.cplusplus.com/reference/i...tream/putback/
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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++ Массив: каким образом можно изменить размер многомерного массива
Новичок С++, каким образом можно в функцию включить динамический массив? C++
Тип BOOL C++

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

Или воспользуйтесь поиском по форуму:
eXPonent
 Аватар для eXPonent
43 / 43 / 2
Регистрация: 21.05.2012
Сообщений: 727
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
Ответ Создать тему
Опции темы

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