Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пользовательский тип, Возможно ли? 
:(
    Опции темы
HMLd
  Дата 15.12.2006, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Можно ли с помощью typedef аль чего другого создать пользовательский тип данных? Например, если мне нужен тип, переменные которого могут принимать только 1 или 0. Можно, конечно, заюзать bool, но тчо делать, если надо, чтобы диапозон значений был до 3 и т.д.?
В общем, если можно, то как?
А то вроде typedef только для переопределения встронных типов, если не ошибаюсь...
PM MAIL   Вверх
Sartorius
Дата 15.12.2006, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Код

enum myEnum {Name1 = 0, Name2 = 10, ... NameN = 100};
...
myEnum myVarible;
...
myVarible = Name1;


PM MAIL ICQ   Вверх
HMLd
Дата 15.12.2006, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 27.6.2006
Где: Polska

Репутация: 1
Всего: 0



Так это ж будет просто константное перечисление, разве нет?
PM MAIL   Вверх
Sartorius
Дата 15.12.2006, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



HMLd, ты хочешь RTTI (Run Time Type Information) использовать? Если нет - то enum - это то что тебе нужно. Если да то
Код

typedef enum {Name1 = 0, Name2 = 10, ... NameN = 100} myEnum;

PM MAIL ICQ   Вверх
Earnest
Дата 15.12.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Можно, конечно, но только не с помощью typedef, а с помощью определения класса.
Например:
Код

class CRestrictedInt
{
public:
   struct BadVal {};
   enum { Min = 0, Max = 3 };

public:
   CRestrictedInt (int val): m_val(val) { if (val <= Min || val >= Max) throw BadVal(); }
   CRestrictedInt& operator = (int val)
   {
      // аналогично, если значение плохое, бросаем исключение
   }

   operator int() const { return m_val; }

private:
   int m_val;
};

Можно вместо исключения присваивать стандартное значение или делать что-то еще, в зависимости от задачи.
Можно прописать арифметические операторы, и т.д.



--------------------
...
PM   Вверх
Любитель
Дата 15.12.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Earnest, не уверен, но этот вариант настораживает. Неявное приведение (как туда так и обратно) явно может дать побочные эффекты. Надо проверить.


--------------------
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 15.12.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Любитель @  15.12.2006,  11:41 Найти цитируемый пост)
Earnest, не уверен, но этот вариант настораживает. Неявное приведение (как туда так и обратно) явно может дать побочные эффекты. Надо проверить.

я лично не вижу чего-то опасного тут.
PM MAIL   Вверх
Любитель
Дата 15.12.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Допустим, у тебя есть функция принимающая твой ограниченный инт. Возможно ты хотел бы также написать версию для обычного инта (мож для конкретной функции какие-то преобразования можно сделать), но пока этого не сделал. В итоге нормально сработает экзепшен.

В достаточно сложном контексте (с несколькими операциями и невными преобразованиями) каое-то значение может проскочить не туда куда надо.


--------------------
PM MAIL ICQ Skype   Вверх
UnrealMan
Дата 15.12.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Earnest @  15.12.2006,  08:58 Найти цитируемый пост)
а с помощью определения класса

IMHO, если для такого типа не предполагается наличие слишком замороченных операций, то вполне сгодится и enum. Как-никак, это тоже будет пользовательский тип, для которого можно перегрузить нужные операторы. Что касается исключений, то для них можно и отдельную функцию с проверкой сделать:

Код
RestrictedInt CheckRestrictedInt(int n)
{
    if (n<0 || n>3)
        throw RestrictedInt(n);
    return RestrictedInt(n);
}


Это сообщение отредактировал(а) UnrealMan - 16.12.2006, 11:49
PM MAIL   Вверх
JackYF
Дата 15.12.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  15.12.2006,  13:00 Найти цитируемый пост)
enum. Как-никак, это тоже будет пользовательский тип, для которого можно перегрузить нужные операторы.


Насколько я знаю, у enum'a ничего нельзя перегружать, и операторы в том числе.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 15.12.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

чтобы диапозон значений был до 3

Код

typedef struct _bit2value {
    unsigned int value: 2;
} bit2_t;


Это сообщение отредактировал(а) MAKCim - 15.12.2006, 16:28


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
HappyLife
Дата 15.12.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Цитата(Любитель @ 15.12.2006,  12:21)
Допустим, у тебя есть функция принимающая твой ограниченный инт. Возможно ты хотел бы также написать версию для обычного инта (мож для конкретной функции какие-то преобразования можно сделать), но пока этого не сделал. В итоге нормально сработает экзепшен.

В достаточно сложном контексте (с несколькими операциями и невными преобразованиями) каое-то значение может проскочить не туда куда надо.

А мы тогда отменим неявное приобразование explicit'том.
PM MAIL   Вверх
JackYF
Дата 15.12.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



MAKCim, в данном случае - да.
А если до другого значения? 5, 7, 23895?
Тогда уже так не сработает.

Все-таки наиболее полно написала Earnest.





--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Fazil6
Дата 15.12.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(HappyLife @  15.12.2006,  16:27 Найти цитируемый пост)
А мы тогда отменим неявное приобразование explicit'том.

это здесь причем? 
и вообще по идее класс должен быть как-бы int и неявные преобразования к int должны присутствовать
PM MAIL   Вверх
UnrealMan
Дата 16.12.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  15.12.2006,  16:16 Найти цитируемый пост)
Насколько я знаю, у enum'a ничего нельзя перегружать, и операторы в том числе. 

Какие-то недостоверные у тебя знания в последнее время пошли, однако. Глобальные операторы для перечислений перегружаются так же, как и для классов. Конечно, некоторые операторы, которые могут быть членами класса, нельзя определить глобальными, но в данном случае такие операторы наверняка излишни.

Кроме того, enum больше походит на int, т.к. его преобразование к целому не пользовательское. Также не будем забывать, что перечисление является POD-типом, что даёт право обращаться с ним более вольно, чем с вышеприведённым классом. В частности, можно создавать объединения (что неприемлемо для классов с конструкторами). Возможно, это не кажется столь уж полезным, но всё же...

Это сообщение отредактировал(а) UnrealMan - 16.12.2006, 11:54
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.