Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
1

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

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

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

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

да ток что бы методы cin и cout корректно выводили строки , а не 1 или 0
как в boolalpha
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2014, 01:27
Ответы с готовыми решениями:

почему $_FILES не всегда определяет тип файла? каким образом можно определить тип в 100% случаях?
почему $_FILES не всегда определяет тип файла? каким образом можно определить тип в 100% случаях?

Каким образом тип значений взаимодействует с ссылочным типом
// Реализовать интерфейсы IEnumerable и IEnumerator. using System; using System.Collections; ...

Можно ли использовать DAO вместо Ado и если Можно то каким образом?
Люди!!!Можно ли использовать DAO вместо Ado и если Можно то каким образом!Спасибо

Можно ли каким-то образом закрыть от записи повреждённые сектора, оставив только те, с которыми можно работать?
Имеется жёсткий диск в очень плохом состоянии - Victoria показывает, что две трети диска - либо bad...

21
18842 / 9841 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
02.05.2014, 02:36 2
eXPonent, наследовать можно только class type.
Почему бы просто не определить для этого типа operator>> и operator<<, которые будут выводить то, что нужно?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 06:28 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, который заставляет компилятор использовать для перечислений минимально возможный размер. Но тут нужно осторожно - в этом случае все компоненты программы должны быть собраны с этим флагом, чтобы не огрести от разного выравнивания в структурах, например. Стоит ли говорить, что это только добавит головняка.
1
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 07:57  [ТС] 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 по умолчанию
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 08:04 5
eXPonent, именно по этой причине я стараюсь не забывать ссылку на ideone - чтобы было видно, что код рабочий и что необходим компилятор с поддержкой С++11, как видно по ссылке в правом верхнем углу. И ниже специально пояснил.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 08:13  [ТС] 6
как определить такой тип, как экземпляр bool ?
без наследования
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 08:30 7
Цитата Сообщение от eXPonent Посмотреть сообщение
как определить такой тип, как экземпляр bool ?
Не понимаю вопроса. Мб Вам нужен оператор приведения к bool в классе? Но учитывая контекст, это странно.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 08:37  [ТС] 8
Нет мне нужно что то вроде точной копии bool
только с перегруженными операторами ввода и вывода
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 08:43 9
А обычный enum почему не подходит?
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 08:44  [ТС] 10
пишу под стандартом С++10
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 08:46 11
Лучший ответ Сообщение было отмечено eXPonent как решение

Решение

Нет такого стандарта.
Да я же выше написал, что можно 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
1
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 14:27  [ТС] 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
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 14:40 13
Цитата Сообщение от eXPonent Посмотреть сообщение
Как правильно организовать
Это как раз та причина, по которой я не изобретаю свои форматы, а сериализую все в xml/json/boost::serialization.
Нужно парсить содержимое потока. При такой постановке - наверное, посимвольно.

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

Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
1
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 14:54  [ТС] 14
А как то можно узнать типу потока которого отправляют?
Или он всё равно идёт посимвольный
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 15:09 15
Не понял вопроса.
Какой тип потока?
Иерархия потоков есть тут http://www.cplusplus.com/refer... ingstream/
Содержимое потока - в любом случае байты. Другое дело - как их интерпретировать.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 15:11  [ТС] 16
Цитата Сообщение от 0x10 Посмотреть сообщение
Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
Как осуществить операцию положить обратно???
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2014, 15:12 17
Цитата Сообщение от eXPonent Посмотреть сообщение
Как осуществить операцию положить обратно???
Выше как раз ссылка на этот пример. Еще вариант - http://www.cplusplus.com/refer... m/putback/
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
03.05.2014, 11:13  [ТС] 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?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
03.05.2014, 11:19 19
Страшное дело)
Цитата Сообщение от eXPonent Посмотреть сообщение
Как из потока выкинуть символы разделители
Видимо, посимвольно выгребать. peek + getc.
Цитата Сообщение от eXPonent Посмотреть сообщение
Что делать с потоком потом если установить failbit
Уже ничего. По идее, установка флага ошибки - это последнее действие перед возвратом из функции.
Цитата Сообщение от eXPonent Посмотреть сообщение
Как обработать данный оператор с помощью обработчика исключений?
Просто так функции работы с потоками исключений кидать не будут, это нужно указать явно. Начать читать можно отсюда - http://www.cplusplus.com/refer... xceptions/

Как я уже сказал выше, с продвинутым и правильным во все поля чтением из стандартных потоков мне работать не приходилось, так что мои навыки тут сводятся к чтению документации. Кастую в тред кого-нибудь, кто на этом собаку съел.
0
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
03.05.2014, 12:44  [ТС] 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
0
03.05.2014, 12:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2014, 12:44
Помогаю со студенческими работами здесь

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

Каким образом можно сократить if?
Добрый день, необходимо сократить if-ы. Подскажите, каким образом это можно сделать? Тело внутри у...

Каким образом можно получить пр 9
люди как вы думаете Каким образом можно получить пр 9 какой-то страницы которая при этом еще и...

Каким образом можно распарсить?
{&quot;ts&quot;:1624396663,&quot;updates&quot;:,]} В общем как можно распарсить все данные из массивов?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru