Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
 Аватар для Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121

Проблема с typedef.... не виден новый тип данных!

29.11.2011, 15:16. Показов 6214. Ответов 62
Метки нет (Все метки)

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

вот фрагмент кода, в котором все и происходит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
switch (MenuType()) 
        {
            case 1: typedef string Type; break;
            case 2: typedef char Type;break;
            case 3: typedef int Type;break;
            case 4: typedef double Type;break;
            case 5: don=true;
        }
        
        //здесь Type уже не виден!
        Set_list<Type> A("SetA"),B("SetB"),C("SetC"),D("SetD");
        Set_list<Type>* pSet[] = { &A, &B, &C, &D };
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.11.2011, 15:16
Ответы с готовыми решениями:

Новый тип данных
есть ли возможность самому создать новый тип данных, на основе старых, который будет в два-три раза длиннее обычных. unsigned long int...

тип typedef
можете кинуть какую нибудь программу с преобразованием типа typedef (С++), очень срочно нужно..

Создать новый тип данных на Си
Подскажите пожалуйста, можно ли создать тип данных больше long double? Прошу, не судите меня строго, я новичок в Си. Я это спрашиваю...

62
Заблокирован
29.11.2011, 20:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Зачем переносить функционал контейнера? У контейнера итак есть функционал. Нам остается написать только 1 функцию, которая работает с контейнером заданного типа.
Мне, что бы написать инструмент, нужно как минимум две вещи понимать:
1. Как его планируется использовать.
2. Для каких целей.

В данном случае, я себе не очень хорошо представляю, как и для чего может понадобится вот такая приблуда?

Вот вы пишите:

Цитата Сообщение от ForEveR Посмотреть сообщение
Нам остается написать только 1 функцию, которая работает с контейнером заданного типа.
А я не догоняю: а что эта функция вообще будит делать?

То есть, задание то выполнить можно и так, и сяк, и этак. Вопрос: а что именно мы делаем?

Сейчас мне это задание видится в сферическом вакууме, я не вижу практической ценности.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2011, 20:44
Bers, Ну смотри.
Человек говорит, что у него есть несколько типов, с каждым типом работа с множеством одинаковая, кроме собственно типа. Не хочет копипастить каждый метод для работы с типом (хотя каждый метод и не пришлось бы, 4 копипаста). Я же предлагаю написать фукцию, в которую перенести результат работы, функция шаблонная, принимает в качестве шаблонного параметра нужный тип. Итого : вся работа выполняется в этой функции (если действительно нет различия, кроме типов), в main остается только выбрать нужный тип ну и другие вещи не относящиеся к этой фукнции.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.11.2011, 20:47
Лучший ответ Сообщение было отмечено как решение

Решение

Bers, все, что раньше было в main() переносим в шаблонную функцию, а в новом main() надо написать меню выбора типа и вызов функции с нужным типом.

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
будит делать
Да прекратите же Вы уже это безобразие :D

3
Заблокирован
29.11.2011, 20:50
ForEveR, А я так понял, что по заданию нужно получить новый контейнер на базе существующего. Но так, что бы этот новый контейнер инкапсулировал внутри себя знание о том, какого типа объекты хранит контейнер, на базе которого он построен.

Дизайн кода может выглядеть, например вот так:
C++
1
2
3
4
5
6
CSuperContainer myCont;
 
myConst.Init(тип_данных); //теперь контейнер содержит 
                      //внутри себя другой контейнер, 
                      //который хранит в себе 
                      //объекты типа тип_данных.
А вот вот что уже дальше будит делаться с таким замороченным контейнером - это уже другой вопрос.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.11.2011, 21:10
Цитата Сообщение от Bers Посмотреть сообщение
А я так понял, что по заданию нужно получить новый контейнер на базе существующего. Но так, что бы этот новый контейнер инкапсулировал внутри себя знание о том, какого типа объекты хранит контейнер, на базе которого он построен.
Надо дождаться автора видимо

Добавлено через 2 минуты
Цитата Сообщение от Bers Посмотреть сообщение
А вот вот что уже дальше будит делаться с таким замороченным контейнером - это уже другой вопрос.
Но я все равно не вижу смысла изменять в ран-тайме тип данных контейнера. Проще же еще один экземпляр создать
Подозреваю, что по заданию надо сделать одно приложение, в котором можно будет поглядеть на множества, содержащие разные типы данных и все. То есть сначала поиграться со строками, потом с числами. Без изменений в коде и повторной компиляции. Вот и все.
0
Заблокирован
29.11.2011, 21:18
fasked, ну если так, то Фореверский вариант сам напросится. Но это не интересно.

Гораздо интереснее придумать, как вот такой доступ получить: (*Cont).Method();
Что б с одной стороны иметь возможность заказывать в рантайме тип контейнера.
А с другой - получать к этому контейнеру доступ, не дублируя интерфейс в обертке.

Ну, по аналогии с работой смартпоинтеров)

Добавлено через 1 минуту
Цитата Сообщение от fasked Посмотреть сообщение
Но я все равно не вижу смысла изменять в ран-тайме тип данных контейнера.

Дык... а кто б его вапще видел то))
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2011, 22:02
Bers, Ну самый простой вариант сделать IContainer шаблонным. Но это все же не в рантайме.
Можно сделать некое подобие boost::any вероятно.

Добавлено через 18 минут
Bers, Вообщем без рефлексии это невозможно по сути.
0
Заблокирован
29.11.2011, 22:02
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Вообщем без рефлексии это невозможно по сути.

ээээ, без чего невозможно?)
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2011, 22:04
Bers, Reflection. Метаданные типа. Как в шарпе
0
Заблокирован
29.11.2011, 22:38
ForEveR, гуглил-шмуглил, так и не проникся, что это такое "рефлексия" и с чем её едят
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2011, 23:13
Bers, http://ru.wikipedia.org/wiki/%... D%E8%E5%29

Пример на шарпе.
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
using System;
using System.Linq;
using System.Text.RegularExpressions;
using System.Reflection;
 
namespace first
{
   class Some
   {
     public Some():this(0)
     {
            
     }
     public Some(int t)
     {
        Value = t;
     }
     public int Value {get; set;}
     public void Method()
     {
       Console.WriteLine(this.GetType().GetMethod("Method").Name);
     }
      static void Main(string[] args)
      {
         Type t = Type.GetType("first.Some");
         ConstructorInfo[] info = t.GetConstructors();
         Some first = (Some)info[0].Invoke(null);
         Console.WriteLine(first.Value);
         Some second = (Some)info[1].Invoke(new object[] {5});
         Console.WriteLine(second.Value);
         MethodInfo method = t.GetMethod("Method");
         method.Invoke(first, null);
      }
   }
}
Вывод :

Code
1
2
3
4
5
0
5
Method
 
Press any key to continue...
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.11.2011, 23:48
Цитата Сообщение от Bers Посмотреть сообщение
Что б с одной стороны иметь возможность заказывать в рантайме тип контейнера.
И еще. Если "заказывать" тип контейнера в ран-тайме, то что делать с уже имеющимися данными в контейнере?
0
 Аватар для Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 13:41  [ТС]
Ох, почитал и окончательно запутался....
0
Заблокирован
30.11.2011, 14:34
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Если вкратце, то надо точно знать, что вы будите делать дальше с "заказанным типом данных".
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
30.11.2011, 15:22
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Вас тут, конечно, на путь истинный наставляют, плохого не посоветуют и все такое - да только вы все сразу-то не пытайтесь понять, так и вправду недолго запутаться.
По принципу baby steps от простого к сложному, да не спеша, - и все у вас получится!
Для начала, чтоб реализовать-таки концепцию однообразной работы с разными типами, попробуйте сделать класс-обертку, умеющий содержать в себе данные нужного типа и содержащий методы, перегруженные для работы с различными типами. Как вам предложил камрад Bers где-то в предыдущих постах.
Пусть это обозвали унылым и топорным способом, но для начала в самый раз, по крайней мере не шибко трудно.
Собственно, тута.
0
 Аватар для Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 15:48  [ТС]
Задание таково: Пользователь выбирает тип данных, выполняются операции с множеством (пересечение, разность - все реализовано уже в виде шаблона и отлажено),
затем опять возврат в меню, выбирается другой тип и опять та же работа с ними....

Все типы данных по отдельности работают нормально, и по условию одновременно идет работа только с одним типом множества...
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2011, 15:49
Fantom.AS, Ну тогда смотрите пост №42
0
 Аватар для Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:33  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Ну смотри.
Человек говорит, что у него есть несколько типов, с каждым типом работа с множеством одинаковая, кроме собственно типа. Не хочет копипастить каждый метод для работы с типом (хотя каждый метод и не пришлось бы, 4 копипаста). Я же предлагаю написать фукцию, в которую перенести результат работы, функция шаблонная, принимает в качестве шаблонного параметра нужный тип. Итого : вся работа выполняется в этой функции (если действительно нет различия, кроме типов), в main остается только выбрать нужный тип ну и другие вещи не относящиеся к этой фукнции.


То есть сделать так:

например:

C++
1
2
3
4
template <class T> func() //если не правильно функцию описал, исправьте, плиз.
{
//работа с множествами
}

а потом:

C++
1
2
3
4
5
6
7
switch (MenuType()) 
                {
                        case 1:  func<int>(); break;
                        case 2: func<double>(); break;
                        case 3:  func<char>(); break;
                        case 4: func<string>(); break;
                }
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2011, 16:40
Fantom.AS, По сути да. Примерно. А дальше от вашего задания зависит.

Добавлено через 28 секунд
C++
1
2
3
4
5
template <class T> 
void func() //если не правильно функцию описал, исправьте, плиз.
{
//работа с множествами
}
0
 Аватар для Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:41  [ТС]
ой, да... про void забыл)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2011, 16:41
Помогаю со студенческими работами здесь

Новый тип данных в объявлении метода класса
Здравствуйте, подскажите, пожалуйста, как сделать, чтобы метод класса мог принимать как аргумент массив, тип данных которого был определен...

Как на VB 7 создать новый тип данных(свой)?
Вопрос прост, не смейтесь но прошу ответа: Как на VB 7 создать новый тип данных(свой)? К сожелению в сети ответа не нашёл, а с...

Функциональный тип через typedef
Приветствую, нужна помощь в решении задачи: В файле заданы строки из 5-ти чисел: границы отрезка, точность, номер функции и номер...

Определяя класс в PHP, мы создаем новый ТИП данных?
Здравствуйте. Собственно говоря, вопрос уже в заголовке. На PHP недавно обратил внимание: программировал на Java, где класс...

Проблема с typedef и FILE*
здравствуйте, пишу typedef FILE* File; выдает ошибку на компиляции.. похоже проблема с файлом..потому что тайпдеф для других...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
ПЛИС
zxcha1ka_ 27.01.2026
AHDL Разработать программы для синтеза следующих устройств: 1. Параллельного регистра 4-х разрядного с синхронной загрузкой и асинхронным сбросом (обнулением); Пoмoгитe пoжaлyйстa
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru