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

Полиморфный multimap в Windows Forms - C++

Восстановить пароль Регистрация
 
GyroReaper
8 / 8 / 1
Регистрация: 20.10.2013
Сообщений: 49
20.10.2013, 16:03     Полиморфный multimap в Windows Forms #1
Сказали сделать вот такую лабу. Контейнер должен работать с числами, строками и структурами(это ключи).

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
36
37
#include "map"
#include "iostream"
using namespace std;
using namespace System;
 
 
class Polymorph {                       //Абстрактный класс
public:
virtual Polymorph& get() = 0 ;      //Виртуальная функция
};
 
 
class Int:public Polymorph {            //Класс целых чисел, потомок Polymorph
private:
    int X ;
public: 
    Int(int &x ) {X=x;}
    Int& get(){return *this;}
};
 
class Str:public Polymorph {            //Класс строк, потомок Polymorph 
    char* S;
public:
    Str(const char* &s) { S = new char[strlen(s)+1] ; strcpy(S , s);}
    Str& get(){return *this;}
};
 
class Struct:public Polymorph {         //Класс структур целых и вещественных чисел, потомок Polymorph
    struct Node{
        int X ;
        int Y;
    };
    Node p;
public:
    Struct( int &x , int &y ) {p.X = x ; p.Y = y; }
    Struct& get(){return *this;}
};
Контейнер представляет из себя multimap<Polymorph* , int>.
Данные, введенные в форму свести к правильным типам получается. Но на поиске происходит облом.
Т.к. ключи - это указатели. Простейшее создание объекта(ключа) выглядит так Int *X = Int(x); .
Элементы добавляются. Количество элементов возвращается. Но при поиске в textBox записывается только "true".
При вызове ф-ии erase(), кот должна удалять элемент, прога ломается с критической ошибкой.
Подозреваю, что вся беда в использовании указателей. И идет только их сравнение. Как добраться до реальных ключей? До человеческих данных, а не до указателей на них? Совсем заблудился. Препод ничего никому не объясняет , только делать заставляет. Уже весь инет перерыл. Помогите разобраться. Заранее спасибо всем ответившим.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2013, 16:03     Полиморфный multimap в Windows Forms
Посмотрите здесь:

C++ Windows Forms
windows forms C++
C++ Полиморфный конструктор [C++]
Полиморфный наследник от exception C++
C++ Windows Forms C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
20.10.2013, 16:18     Полиморфный multimap в Windows Forms #2
Цитата Сообщение от GyroReaper Посмотреть сообщение
Контейнер представляет из себя multimap<Polymorph* , int>.
Можно переопределить сравнение:
C++
1
2
3
4
5
6
7
8
struct polymorph_compare {
   
   bool operator ()(Polymorph * lhs, Polymorph * rhs) const {
      // здесь сравнение, меньше ли левый аргумент
   }
};
 
std::multimap<Polymorph *, int, polymorph_compare> mapping;
GyroReaper
8 / 8 / 1
Регистрация: 20.10.2013
Сообщений: 49
20.10.2013, 17:47  [ТС]     Полиморфный multimap в Windows Forms #3
Не совсем понятно.
Нам вообще по сути ничего толкового не объяснили. Привели пример полиморфного объекта, на этом все. WinForms и STL изучать сказали самостоятельно. Так что я тот еще чайник.
Приведу пример из обработчика события, отвечающего за извлечение элемента.


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
private: System::Void button7_Click(System::Object^  sender, System::EventArgs^  e) 
         {
             if(c) //если контейнер есть
             {
                 if ( textBox1 -> Text == "") MessageBox::Show("Поле пусто!");
                 else
                 {
                     Int32 e = 0 ;
                     if (Int32::TryParse(textBox1 -> Text , e) ) //проверка ввода целого числа
                     {
                         int x = System::Convert::ToInt32(textBox1 -> Text);
                         Int *X = new Int(x);
                         T::iterator itl , itr , i ;
                         itr = c -> upper_bound(X);   //первый элемент последовательности с ключом X
                         itl = c -> lower_bound(X);   //первый следующий за последовательностью
                         i = itl;
                         do
                         {
                             c -> erase(i);
                             i++;
                         }while(i != itr);
                        
                     }
                     else MessageBox::Show("Введите целое число!!!");
                 }
             }
             else MessageBox::Show("Неоткуда извлекать!!!");
         }
Если попробовать вот так:
textBox1 -> Text = System::Convert::ToString(X); То получаем true, но не число. Мб есть вариант обратного преобразования из Int в int?

Под T затайпдифино multimap<Polymorph* , int>

Добавлено через 1 час 16 минут
Тогда вопрос такой. Как сделать полиморфным контейнер, но в качестве ключей использовать не указатели, а сами полиморфные объекты? И как извлекать из них стандартные типы данных?

Так, чтобы было multimap<Polymorph , int>

И как организовать извлечение любого из типов?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.10.2013, 20:12     Полиморфный multimap в Windows Forms #4
Цитата Сообщение от GyroReaper Посмотреть сообщение
Тогда вопрос такой. Как сделать полиморфным контейнер, но в качестве ключей использовать не указатели, а сами полиморфные объекты? И как извлекать из них стандартные типы данных?
никак
Yandex
Объявления
20.10.2013, 20:12     Полиморфный multimap в Windows Forms
Ответ Создать тему
Опции темы

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