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

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

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

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

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

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

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

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

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

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

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

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

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

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

21
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,293
02.05.2014, 02:36 #2
eXPonent, наследовать можно только class type.
Почему бы просто не определить для этого типа operator>> и operator<<, которые будут выводить то, что нужно?
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
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
eXPonent
99 / 52 / 2
Регистрация: 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
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
02.05.2014, 08:04 #5
eXPonent, именно по этой причине я стараюсь не забывать ссылку на ideone - чтобы было видно, что код рабочий и что необходим компилятор с поддержкой С++11, как видно по ссылке в правом верхнем углу. И ниже специально пояснил.
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 08:13  [ТС] #6
как определить такой тип, как экземпляр bool ?
без наследования
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
02.05.2014, 08:30 #7
Цитата Сообщение от eXPonent Посмотреть сообщение
как определить такой тип, как экземпляр bool ?
Не понимаю вопроса. Мб Вам нужен оператор приведения к bool в классе? Но учитывая контекст, это странно.
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 08:37  [ТС] #8
Нет мне нужно что то вроде точной копии bool
только с перегруженными операторами ввода и вывода
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
02.05.2014, 08:43 #9
А обычный enum почему не подходит?
0
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 08:44  [ТС] #10
пишу под стандартом С++10
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
02.05.2014, 08:46 #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
1
eXPonent
99 / 52 / 2
Регистрация: 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
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
02.05.2014, 14:40 #13
Цитата Сообщение от eXPonent Посмотреть сообщение
Как правильно организовать
Это как раз та причина, по которой я не изобретаю свои форматы, а сериализую все в xml/json/boost::serialization.
Нужно парсить содержимое потока. При такой постановке - наверное, посимвольно.

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

Что важно: в случае ошибки при чтении содержимое потока должно остаться таким же, каким было до попытки чтения. Т.е. если извлекли из потока данные, определили, что они невалидные, их нужно положить обратно. При этом не забыть выставить флаг failbit.
1
eXPonent
99 / 52 / 2
Регистрация: 21.05.2012
Сообщений: 1,170
02.05.2014, 14:54  [ТС] #14
А как то можно узнать типу потока которого отправляют?
Или он всё равно идёт посимвольный
0
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,068
02.05.2014, 15:09 #15
Не понял вопроса.
Какой тип потока?
Иерархия потоков есть тут http://www.cplusplus.com/reference/sstream/stringstream/
Содержимое потока - в любом случае байты. Другое дело - как их интерпретировать.
0
02.05.2014, 15:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2014, 15:09
Привет! Вот еще темы с ответами:

C++ std::regex каким образом можно вывести все совпадения? - C++
Работаю в Visual Studio 2012. Каким образом я могу получить значения всех совпадений? Ищу так: std::string input; std::regex...

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

Каким образом можно использовать регулярное выражение regex из .NET под С++ - C++
Работаю в VS Express 2012. Насколько понимаю, эта библиотека должна подключаться и к проекту на С++, но как это сделать, чтобы не надо...

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


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

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

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