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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
#1

Приведение типов - C++

13.05.2012, 10:23. Просмотров 1504. Ответов 19
Метки нет (Все метки)

В паскале можно привести типы:
Pascal
1
2
3
type
  ts = 0..9;
  chislo = array[1..nmax] of ts;
Как это сделать на С++?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 10:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приведение типов (C++):

Приведение типов - C++
Есть задача создать список с объектами у которых разные классы, но один базовый предок. Потом нужно перебрать список и если объект одного...

Приведение типов - C++
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

Приведение типов - C++
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a = (float)123.4

Приведение типов - C++
Доброго времени суток. Данный кусок кода выделяет целую часть. Потом, вычитая из исходного числа целую часть, получаем дробную. Почему...

Приведение типов - C++
Доброго времени суток. Пусть имеются две структуры struct Student { string FirstName; string LastName; int year;

Приведение типов - C++
в GUI ни int str = static_convert<int>(Edit1->Text) ни int str = (int)Edit1->Text не приводит : E2034 Cannot convert...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
13.05.2012, 11:33 #2
В С++ есть оператор typedef.
Однако именно для такого случая
(ограничение диапазона значений переменной)
простого решения в голову не приходит.
Можно сделать контейнерный класс,
в котором задать эти ограничения
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
#include <iostream>
using namespace std;
class ts
{
private:
unsigned short val;
public:
    ts():val(0){}
ts& operator=(ts& a){val=a.val;return *this;} 
ts& operator=(int a)
{
    if(a<0)a=0;
    else if(a>9)a=9;
    val=a;
    return *this;
}
friend ostream& operator<<(ostream& os,ts& a)
{
    os<<a.val;
    return os;
}
};
int main(int argc, char *argv[])
{
    const int nmax=2;
    ts chislo[nmax];
    chislo[0]=10;
    chislo[1]=chislo[0];
    cout<<chislo[0]<<" "<<chislo[1];
    system("pause");
}
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 11:54 #3
SeryZone, Вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
dig digit;
 
int main()
{
    digit = one;
    std::cout << digit << std::endl;
}
http://liveworkspace.org/code/272844...5f69707c0ef999
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 12:02 #4
Приведение типов в с++ намного, намного более мощное и запутанное чем в паскале, однако множеств в языке нету(ибо не нужны).
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:14 #5
Цитата Сообщение от diagon Посмотреть сообщение
однако множеств в языке нету(ибо не нужны).
А как же std::set?
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:17 #6
Цитата Сообщение от go Посмотреть сообщение
А как же std::set?
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:23 #7
Цитата Сообщение от diagon Посмотреть сообщение
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Это стандартный класс. Чего вы от него хотите? string в паскале что это?

Цитата Сообщение от diagon Посмотреть сообщение
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
Цитата Сообщение от SeryZone Посмотреть сообщение
ts = 0..9;
Цитата Сообщение от go Посмотреть сообщение
enum dig
{
zero, one, two, three, four, five, six, seven, eight, nine
};
Я считаю это почти одно и тоже
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:31 #8
Хотя нет, это не множества, а просто перечисляемый тип.

Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Так что да, это почти одно и тоже.

А множества, это, к примеру, вот
Pascal
1
if 3 in [1..9] + [20..30]  //если 3 лежит в диапазоне [1..9] или в диапазоне [20..30]
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
13.05.2012, 14:33 #9
Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:38 #10
Цитата Сообщение от diagon Посмотреть сообщение
А множества, это, к примеру, вот
Множество там и там одиново.
Pascal
1
set of char {например, так}
C++
1
std:;set<char>
Я не вижу разницы. Хотя функциональность явно в С++ повыше.

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
Но все Си это возможно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
enum dig digit;
 
int main()
{
    digit = 9;
    printf("%d\n", digit); 
}
http://liveworkspace.org/code/2e8813...54677e46b6b753
В плюсах вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
dig digit;
 
int main()
{
    digit = static_cast<dig> (9);
    std::cout << digit << std::endl;
}
http://liveworkspace.org/code/ee6c5b...1fbf428b0191cc
Просто привели тип.
1
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:39 #11
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
Неправда, можно писать digit = 9
Хотя стоп, вроде нельзя. А вроде и можно было >_<''
Если явно привести тип, то точно можно.
Ну да, можно явно сравнивать с числами, а вот присваивать нельзя.

Цитата Сообщение от go Посмотреть сообщение
Я не вижу разницы. Хотя функциональность явно в С++ повыше.
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.). Аналог того условия, что я привел выше, на с++ будет занимать ~10 строк.
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:43 #12
Цитата Сообщение от diagon Посмотреть сообщение
Если явно привести тип, то точно можно.
В С++ только так все и делается. Ведь 9 это целое число. http://liveworkspace.org/code/ee6c5b...1fbf428b0191cc

Цитата Сообщение от diagon Посмотреть сообщение
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.).
Ну как это нельзя??? Чуть-чуть извернутся, то и получится.
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:52 #13
Цитата Сообщение от go Посмотреть сообщение
Ну как это нельзя??? Чуть-чуть извернутся, то и получится
Чуть-чуть? :)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    std::set< int > first; //[0..9]
    for (int i = 0; i <= 9; ++i)
        first.insert(i);
        
    std::set< int > second; //[20..30]
    for (int i = 20; i <= 30; ++i)
        second.insert(i);
        
    std::set< int > third; //[0..9] + [20..30]
    std::set_union
    (
        first.begin(), first.end(),
        second.begin(), second.end(),
        std::inserter< std::set< int > > (third, third.begin() )
    );
    
    int x = 3;
    
    if ( third.find(x) != third.end() ) //...
0
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
07.07.2012, 21:42  [ТС] #14
Ладно, например я хочу получить не __int64 (до 264-1), а до 2128-1; Умельцы на хабе делали так, но как это сделать вообще?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.07.2012, 22:06 #15
SeryZone, именно int - через длинку. Можно float/double, но вычисления будут происходить дольше.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2012, 22:06
Привет! Вот еще темы с ответами:

Приведение типов - C++
В чем различие привидения типа (type)expression, от type(expression)?

Приведение типов? - C++
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает. .h class Km { private: static const...

Приведение типов - C++
Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого qsort. Вот что получилось: ...

Приведение типов - C++
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d = 10, это правильно. В чём подвох? int main() { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.07.2012, 22:06
Ответ Создать тему
Опции темы

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