Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
29.11.2011, 15:16     Проблема с typedef.... не виден новый тип данных! #1
Пишу шаблон класса множество, у множеств элементы могут быть разного типа, одно, например, целочисленное, другое - строка.
Пользователю дается возможность выбрать тип, с которым ему работать.
Тип выбирается через функцию 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 };
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2011, 15:16     Проблема с typedef.... не виден новый тип данных!
Посмотрите здесь:

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

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

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

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

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

Сейчас мне это задание видится в сферическом вакууме, я не вижу практической ценности.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2011, 20:44     Проблема с typedef.... не виден новый тип данных! #42
Bers, Ну смотри.
Человек говорит, что у него есть несколько типов, с каждым типом работа с множеством одинаковая, кроме собственно типа. Не хочет копипастить каждый метод для работы с типом (хотя каждый метод и не пришлось бы, 4 копипаста). Я же предлагаю написать фукцию, в которую перенести результат работы, функция шаблонная, принимает в качестве шаблонного параметра нужный тип. Итого : вся работа выполняется в этой функции (если действительно нет различия, кроме типов), в main остается только выбрать нужный тип ну и другие вещи не относящиеся к этой фукнции.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2011, 20:47     Проблема с typedef.... не виден новый тип данных! #43
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Bers, все, что раньше было в main() переносим в шаблонную функцию, а в новом main() надо написать меню выбора типа и вызов функции с нужным типом.

Не по теме:

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

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

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

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

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

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

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

Дык... а кто б его вапще видел то))
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2011, 22:02     Проблема с typedef.... не виден новый тип данных! #47
Bers, Ну самый простой вариант сделать IContainer шаблонным. Но это все же не в рантайме.
Можно сделать некое подобие boost::any вероятно.

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

ээээ, без чего невозможно?)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2011, 22:04     Проблема с typedef.... не виден новый тип данных! #49
Bers, Reflection. Метаданные типа. Как в шарпе
Bers
Заблокирован
29.11.2011, 22:38     Проблема с typedef.... не виден новый тип данных! #50
ForEveR, гуглил-шмуглил, так и не проникся, что это такое "рефлексия" и с чем её едят
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.11.2011, 23:13     Проблема с typedef.... не виден новый тип данных! #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...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.11.2011, 23:48     Проблема с typedef.... не виден новый тип данных! #52
Цитата Сообщение от Bers Посмотреть сообщение
Что б с одной стороны иметь возможность заказывать в рантайме тип контейнера.
И еще. Если "заказывать" тип контейнера в ран-тайме, то что делать с уже имеющимися данными в контейнере?
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 13:41  [ТС]     Проблема с typedef.... не виден новый тип данных! #53
Ох, почитал и окончательно запутался....
Bers
Заблокирован
30.11.2011, 14:34     Проблема с typedef.... не виден новый тип данных! #54
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Если вкратце, то надо точно знать, что вы будите делать дальше с "заказанным типом данных".
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
30.11.2011, 15:22     Проблема с typedef.... не виден новый тип данных! #55
Цитата Сообщение от Fantom.AS Посмотреть сообщение
Ох, почитал и окончательно запутался....
Вас тут, конечно, на путь истинный наставляют, плохого не посоветуют и все такое - да только вы все сразу-то не пытайтесь понять, так и вправду недолго запутаться.
По принципу baby steps от простого к сложному, да не спеша, - и все у вас получится!
Для начала, чтоб реализовать-таки концепцию однообразной работы с разными типами, попробуйте сделать класс-обертку, умеющий содержать в себе данные нужного типа и содержащий методы, перегруженные для работы с различными типами. Как вам предложил камрад Bers где-то в предыдущих постах.
Пусть это обозвали унылым и топорным способом, но для начала в самый раз, по крайней мере не шибко трудно.
Собственно, тута.
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 15:48  [ТС]     Проблема с typedef.... не виден новый тип данных! #56
Задание таково: Пользователь выбирает тип данных, выполняются операции с множеством (пересечение, разность - все реализовано уже в виде шаблона и отлажено),
затем опять возврат в меню, выбирается другой тип и опять та же работа с ними....

Все типы данных по отдельности работают нормально, и по условию одновременно идет работа только с одним типом множества...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.11.2011, 15:49     Проблема с typedef.... не виден новый тип данных! #57
Fantom.AS, Ну тогда смотрите пост №42
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:33  [ТС]     Проблема с typedef.... не виден новый тип данных! #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;
                }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.11.2011, 16:40     Проблема с typedef.... не виден новый тип данных! #59
Fantom.AS, По сути да. Примерно. А дальше от вашего задания зависит.

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

Новый тип данных в объявлении метода класса C++
C++ тип typedef
C++ Заголовочный файл подключен, но не виден тип

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

Или воспользуйтесь поиском по форуму:
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
30.11.2011, 16:41  [ТС]     Проблема с typedef.... не виден новый тип данных! #60
ой, да... про void забыл)
Yandex
Объявления
30.11.2011, 16:41     Проблема с typedef.... не виден новый тип данных!
Ответ Создать тему
Опции темы

Текущее время: 03:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru