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

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

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

Author24 — интернет-сервис помощи студентам
Пишу шаблон класса множество, у множеств элементы могут быть разного типа, одно, например, целочисленное, другое - строка.
Пользователю дается возможность выбрать тип, с которым ему работать.
Тип выбирается через функцию 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2011, 15:16
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

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

Решение

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

Не по теме:

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

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

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

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

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

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

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

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

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

ээээ, без чего невозможно?)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2011, 22:04 49
Bers, Reflection. Метаданные типа. Как в шарпе
0
Заблокирован
29.11.2011, 22:38 50
ForEveR, гуглил-шмуглил, так и не проникся, что это такое "рефлексия" и с чем её едят
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2011, 23:13 51
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);
      }
   }
}
Вывод :

Код
0
5
Method

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

Все типы данных по отдельности работают нормально, и по условию одновременно идет работа только с одним типом множества...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2011, 15:49 57
Fantom.AS, Ну тогда смотрите пост №42
0
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:33  [ТС] 58
Цитата Сообщение от 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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.11.2011, 16:40 59
Fantom.AS, По сути да. Примерно. А дальше от вашего задания зависит.

Добавлено через 28 секунд
C++
1
2
3
4
5
template <class T> 
void func() //если не правильно функцию описал, исправьте, плиз.
{
//работа с множествами
}
0
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:41  [ТС] 60
ой, да... про void забыл)
0
30.11.2011, 16:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2011, 16:41
Помогаю со студенческими работами здесь

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

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

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

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


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

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