Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
#1

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

29.11.2011, 15:16. Просмотров 2759. Ответов 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++):

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

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

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

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

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

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

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

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

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

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

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

Сейчас мне это задание видится в сферическом вакууме, я не вижу практической ценности.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.11.2011, 20:44 #42
Bers, Ну смотри.
Человек говорит, что у него есть несколько типов, с каждым типом работа с множеством одинаковая, кроме собственно типа. Не хочет копипастить каждый метод для работы с типом (хотя каждый метод и не пришлось бы, 4 копипаста). Я же предлагаю написать фукцию, в которую перенести результат работы, функция шаблонная, принимает в качестве шаблонного параметра нужный тип. Итого : вся работа выполняется в этой функции (если действительно нет различия, кроме типов), в main остается только выбрать нужный тип ну и другие вещи не относящиеся к этой фукнции.
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.11.2011, 20:47 #43
Лучший ответ Сообщение было отмечено как решение

Решение

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

Не по теме:

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

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

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

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

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

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

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

Дык... а кто б его вапще видел то))
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 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
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
29.11.2011, 23:48 #52
Цитата Сообщение от Bers Посмотреть сообщение
Что б с одной стороны иметь возможность заказывать в рантайме тип контейнера.
И еще. Если "заказывать" тип контейнера в ран-тайме, то что делать с уже имеющимися данными в контейнере?
0
Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 13:41  [ТС] #53
Ох, почитал и окончательно запутался....
0
Bers
Заблокирован
30.11.2011, 14:34 #54
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Если вкратце, то надо точно знать, что вы будите делать дальше с "заказанным типом данных".
0
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
30.11.2011, 15:22 #55
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Вас тут, конечно, на путь истинный наставляют, плохого не посоветуют и все такое - да только вы все сразу-то не пытайтесь понять, так и вправду недолго запутаться.
По принципу baby steps от простого к сложному, да не спеша, - и все у вас получится!
Для начала, чтоб реализовать-таки концепцию однообразной работы с разными типами, попробуйте сделать класс-обертку, умеющий содержать в себе данные нужного типа и содержащий методы, перегруженные для работы с различными типами. Как вам предложил камрад Bers где-то в предыдущих постах.
Пусть это обозвали унылым и топорным способом, но для начала в самый раз, по крайней мере не шибко трудно.
Собственно, тута.
0
Fantom.AS
2 / 1 / 2
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 15:48  [ТС] #56
Задание таково: Пользователь выбирает тип данных, выполняются операции с множеством (пересечение, разность - все реализовано уже в виде шаблона и отлажено),
затем опять возврат в меню, выбирается другой тип и опять та же работа с ними....

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

Что значит (для сущности «вершина» создать новый тип данных)?
Задание такое: Написать функцию для вычисления площади треугольника на...

Заголовочный файл подключен, но не виден тип
Работаю в QT. Выдает ошибку does not name a type, как будто нет такого типа. У...

Typedef void F(); typedef для типа функции через идентификатор
Здравствуйте цитата из typedef MSDN в интернете мне удалось нарыть только...

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


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

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

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