Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
1

Специализация и обобщение в С++ через универсальный указатель

10.03.2012, 11:37. Показов 2980. Ответов 8
Метки нет (Все метки)

Здравствуйте, уважаемые участники форума!

Возникла следующая проблема. Необходимо написать обобщение, построенное на основе косвенного указателя void*. Поясню подробнее.

Я сумел сделать так. Имеется какая-то структура, обобщающая типы данных:

C++
1
2
3
4
5
6
7
8
9
struct data
 
{
enum htype {cl, pr};
htype k; // ключ
 
union type {club cl, priv pr};
type t; // здесь club и priv - определенные ранее типы, t - тип обобщения.
}
затем программа работала нормально, использовался какой-нибудь тип контейнера, к примеру линейный однонаправленный список:

C++
1
2
3
4
5
struct spisok
{
spisok *next; // указатель на следующий элемент
data d;
}
В процессе считывания данных с клавиатуры, к примеру, для начала считывался ключ k, а затем в зависимости от ключа предлагалось пользователю ввести данные для альтернатив:

C++
1
2
3
4
5
6
7
8
switck (k):
case 0:
{
cin>>nov->d.t.cl;
}
case 1:
cin>>nov->d.t.pr;
}
где nov - это элемент нашего линейного списка.

Таким образом было построено обобщение. Теперь задание - построить обобщение через косвенное связывание через указатель void*. Разбирался, разбирался, не понял ничего. Буду благодарен за любую помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2012, 11:37
Ответы с готовыми решениями:

Указатель типа void. Использование косвенного связывания через универсальный указатель
Необходимо использовать косвенного связывания через универсальный указатель, примерный вид: struct...

Универсальный вызов метода через указатель на объект
Никак не могу найти универсальную конструкцию, которая позволяла бы вызывать любой метод класс, с...

Универсальный указатель или универсальный скалярный тип
Здравствуйте! Помогите, пожалуйста написать программу: требуется написать универсальный скалярный...

Универсальный указатель
Хочу создать список: источник, вывод. То есть QList<source*,QGraphicsVideoItem*>, только source...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
8
Эксперт С++
5816 / 3468 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
10.03.2012, 12:51 2
qwrus, такое актуально только в С. В С++ это решается с помощью шаблонов и/или наследования. Я так понял, тебе нужно сделать гетерогенный список?

Вот пример:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <list>
#include <memory>
 
class Base
{
public:
    virtual void do_something() = 0;
};
 
class DerivedA: public Base
{
public:
    DerivedA(int i)
    : _i(i)
    {
    }
 
    void do_something()
    {
    std::cout << "DerivedA: " << _i << std::endl;
    }
private:
    int _i;
};
 
class DerivedB: public Base
{
public:
    DerivedB(double d)
    : _d(d)
    {
    }
    
    void do_something()
    {
    std::cout << "DerivedB: " << _d << std::endl;
    }
private:
    double _d;
};
    
int main()
{
    std::list<std::shared_ptr<Base> > list;
 
    for(size_t i = 0; i < 5; ++i)
    {
    int i;
 
    std::cin >> i;
 
    if(i)
    {
        int j;
        std::cin >> j;
 
        std::shared_ptr<Base> ptr(new DerivedA(j));
        
        list.push_back(ptr);
    }
    else
    {
        double d;
        std::cin >> d;
 
        std::shared_ptr<Base> ptr(new DerivedB(d));
        
        list.push_back(ptr);
    }
    }
 
    for(const std::shared_ptr<Base>& ptr: list)
    {
    ptr->do_something();
    }
}
0
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
11.03.2012, 10:45  [ТС] 3
Nameless One, беда в том, что преподавателю требуется именно указатель void*. Предмет - технологии программирования, отрабатываем различные методы организации данных.
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
11.03.2012, 11:34 4
Nameless One, чем boost::any не подходит?
0
Эксперт С++
5816 / 3468 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
11.03.2012, 11:34 5
go, тем, что его нет в стандарте. Ну и еще тем, что задание явно учебное.
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
12.03.2012, 10:39 6
Цитата Сообщение от Nameless One Посмотреть сообщение
тем, что его нет в стандарте.
Некоторые программисты считают его стандартом де-факто и необходимым дополнением к STL.

Цитата Сообщение от Nameless One Посмотреть сообщение
Ну и еще тем, что задание явно учебное.
Так реализовать его не так и сложно. Вот готовый https://www.cyberforum.ru/post1604364.html
0
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
12.03.2012, 10:59 7
go, Я бы сказал большинство программистов. И из буста многое перелетает в стандарт.
0
Эксперт С++
5816 / 3468 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
12.03.2012, 12:55 8
go, ForEveR, вы это потом его преподавателю объясняйте, почему он не сделал свой велосипед, а воспользовался нестандартной библиотекой
0
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
12.03.2012, 13:00 9
Nameless One, А никто ведь не просит человека нести сразу преподавателю. Дали тебе пример, сделанный через any - смотришь на реализацию any и делаешь свой велосипед...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2012, 13:00

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

универсальный указатель
Возможно ли сделать универсальный указатель, который будет указывать на переменную любого типа?...

универсальный указатель
Добрый вечер. Можно ли создать шаблон, что бы не приводить явно универсальный указатель к...

Обобщение данных через запятую
Добрый день. Подскажите, как решить данную задачу. Есть таблица из двух колонок, первая колонка -...

Зависает синхронизация данных через универсальный формат
Доброго времени. Отпал обмен. Синхронизация через универсальный формат УТ - БП односторониий. ...


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

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

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