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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
#1

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

29.11.2011, 15:16. Просмотров 2677. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2011, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема с typedef.... не виден новый тип данных! (C++):

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

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

Проблема с define и typedef - C++
Объясните мне пожалуйста, товарищи... В чем смысл объявлять такие дурацкие дефайны кто это делает? и таких бессмысленных дефайнов, просто...

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

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

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

62
Bers
Заблокирован
29.11.2011, 21:18 #46
fasked, ну если так, то Фореверский вариант сам напросится. Но это не интересно.

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

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

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

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

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

ээээ, без чего невозможно?)
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.11.2011, 22:04 #49
Bers, Reflection. Метаданные типа. Как в шарпе
0
Bers
Заблокирован
29.11.2011, 22:38 #50
ForEveR, гуглил-шмуглил, так и не проникся, что это такое "рефлексия" и с чем её едят
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.11.2011, 23:13 #51
Bers, http://ru.wikipedia.org/wiki/%CE%F2%...E0%ED%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
fasked
Эксперт С++
4963 / 2543 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.11.2011, 23:48 #52
Цитата Сообщение от Bers Посмотреть сообщение
Что б с одной стороны иметь возможность заказывать в рантайме тип контейнера.
И еще. Если "заказывать" тип контейнера в ран-тайме, то что делать с уже имеющимися данными в контейнере?
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 13:41  [ТС] #53
Ох, почитал и окончательно запутался....
0
Bers
Заблокирован
30.11.2011, 14:34 #54
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Если вкратце, то надо точно знать, что вы будите делать дальше с "заказанным типом данных".
0
BRcr
4012 / 2302 / 156
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
30.11.2011, 15:22 #55
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Вас тут, конечно, на путь истинный наставляют, плохого не посоветуют и все такое - да только вы все сразу-то не пытайтесь понять, так и вправду недолго запутаться.
По принципу baby steps от простого к сложному, да не спеша, - и все у вас получится!
Для начала, чтоб реализовать-таки концепцию однообразной работы с разными типами, попробуйте сделать класс-обертку, умеющий содержать в себе данные нужного типа и содержащий методы, перегруженные для работы с различными типами. Как вам предложил камрад Bers где-то в предыдущих постах.
Пусть это обозвали унылым и топорным способом, но для начала в самый раз, по крайней мере не шибко трудно.
Собственно, тута.
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 15:48  [ТС] #56
Задание таково: Пользователь выбирает тип данных, выполняются операции с множеством (пересечение, разность - все реализовано уже в виде шаблона и отлажено),
затем опять возврат в меню, выбирается другой тип и опять та же работа с ними....

Все типы данных по отдельности работают нормально, и по условию одновременно идет работа только с одним типом множества...
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.11.2011, 15:49 #57
Fantom.AS, Ну тогда смотрите пост №42
0
Fantom.AS
2 / 1 / 0
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.11.2011, 16:40 #59
Fantom.AS, По сути да. Примерно. А дальше от вашего задания зависит.

Добавлено через 28 секунд
C++
1
2
3
4
5
template <class T> 
void func() //если не правильно функцию описал, исправьте, плиз.
{
//работа с множествами
}
0
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:41  [ТС] #60
ой, да... про void забыл)
0
30.11.2011, 16:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 16:41
Привет! Вот еще темы с ответами:

Заголовочный файл подключен, но не виден тип - C++
Работаю в QT. Выдает ошибку does not name a type, как будто нет такого типа. У меня 2 класса и в каждом указатель на другой. Подключаю...

Как объявить указатель на массив через typedef и как инициализировать такой тип - C++
Как заставить заработать этот фрагмент кода? INT_L -- указатель на массив из 100 элементов типа char; Не получается в переменную C...

Определён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? - C++
Определеён ли тип PINPUT_RECORD как typedef INPUT_RECORD *PINPUT_RECORD;? Или как?

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


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

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

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