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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
#1

универсальный указатель - C++

24.02.2013, 22:46. Просмотров 1573. Ответов 38
Метки нет (Все метки)

Добрый вечер.
Можно ли создать шаблон, что бы не приводить явно универсальный указатель к определенному типу при разыменовании?
Или по крайней мене узнать тип (размер) данных которые хранятся по указанному адресу?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2013, 22:46     универсальный указатель
Посмотрите здесь:

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

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

Специализация и обобщение в С++ через универсальный указатель - C++
Здравствуйте, уважаемые участники форума! Возникла следующая проблема. Необходимо написать обобщение, построенное на основе косвенного...

Сделать указатель на указатель NULL - C++
есть код: class Matrix { private: double **data; //нужно, чтобы в самом начале это было NULL double *b; //и это тоже было NULL ...

Указатель на указатель - разница способов - C++
int a =5; int *b = &a; int **e =&b; //первый способ //Нужно писать столько * скока указателей.. int *f = b; //Втрой...

Задача на указатели.Указатель на указатель. - C++
Таблица футбольного чемпионата задана квадратной матрицей порядка n, в которой все элементы, принадлежащие главной диагонали равны 0, а...

Указатель на указатель, класс группа - C++
помогите пожалуйста не могу понять что со строкой 312 знаю что с указателем что то не то... но исправить не получается //4. В...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
24.02.2013, 22:47     универсальный указатель #2
нет, а зачем?
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 22:50  [ТС]     универсальный указатель #3
Kuzia domovenok, Что бы написать что то подобное:
C++
1
2
3
4
5
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return *(T*)pa * *(T*)pb * *(T*)pc;
}
Только тут ошибка, вместо (T*) мне нужно указать тип данных который содержит ячейка памяти...

Просто без этого я не вижу смысла в универсальном указателе....
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:02     универсальный указатель #4
Цитата Сообщение от fuelcs Посмотреть сообщение
Только тут ошибка, вместо (T*) мне нужно указать тип данных который содержит ячейка памяти...
Зачем?

C++
1
2
3
4
5
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return (*pa) * (*pb) * (*pc);
}
Это ли не то, чего хотел добиться?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
    int a = 1;
    int b = 2;
    int c = 3;
    std:: cout << mult(&a,&b,&c) << std::endl;
 
    double aa = 1.1;
    double bb = 2.2;
    double cc = 3.3;
    std:: cout << mult(&aa,&bb,&cc) << std::endl;
Ну и пример использования. Или я неправильно понял проблему? Пиши, разберемся
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:02  [ТС]     универсальный указатель #5
ITcrusader, как зачем???
C++
1
2
3
4
5
...
int a,b,c;
void* pa=&a,*pb=&b,*pc=&c;
...
mult(pa,pb,pc)
указатель то универсальный...
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:08     универсальный указатель #6
Вот оно что) А может лучшее решение найдется после ответа на вопрос "А зачем?"
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:12  [ТС]     универсальный указатель #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
template <typename T>
int mult (T* pa, T* pb, T* pc)
{
    return (*pa) * (*pb) * (*pc);
}
 
using namespace std;
 
int main()
{   
    int a,b,c;
    void* pa=&a,*pb=&b,*pc=&c;
    cin >> a;
    cin >> b;
    cin >> c;
    cout << "\n";
    cout << *(int*)pa << " * " << *(int*)pb << " * " << *(int*)pc << " = " << mult(pa,pb,pc) << "\n";
    cout << "\n";
 
    return 0;
}
если указатель про процессе работы будет указывать на разные типы данных...

Добавлено через 1 минуту
Цитата Сообщение от ITcrusader Посмотреть сообщение
"А зачем?"
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
24.02.2013, 23:19     универсальный указатель #8
Цитата Сообщение от fuelcs Посмотреть сообщение
а толку с универсального указателя, если что бы его разыменовать нужно указать тип?
смотри сишные универсальные функции, использовавшиеся до шаблонов. qsort, memset, memcpy
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:22     универсальный указатель #9
Цитата Сообщение от fuelcs Посмотреть сообщение
void* pa=&a,*pb=&b,*pc=&c
Вот здесь вы теряете всю информацию о типах. А это очень плохо. Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
24.02.2013, 23:22     универсальный указатель #10
Ну, в общем, так. Использование указателей на void целесообразно в единичных случаях (и то, с целью лютой унификации и спрятано должно быть в недрах реализации), например, при создании контейнера и то требует надстройки интерфейса над этим ночным кошмаром, который будет осуществлять строгий контроль типов. Я, может, это от безысходности пишу)) Но батьки так советуют (Мейерс, Скотт).
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
24.02.2013, 23:25     универсальный указатель #11
Цитата Сообщение от diagon Посмотреть сообщение
Не надо использовать void* в плюсах, ведь практически всегда есть альтернативы.
а как же qsort, memset memcpy и прочий stdlib.h???
fuelcs
24.02.2013, 23:28  [ТС]
  #12

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
memset
можно пример связки memset и void* ?

diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.02.2013, 23:29     универсальный указатель #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
qsort
Он гораздо медленнее std::sort как раз-таки из-за того, что не имеет информации о типах и не может инлайнить вызов функции сравнения.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
memset memcpy
Это вообще сишные POD'овые функции, написать с ними что-либо универсальное невозможно.

А вообще, реализация из #4 полностью универсальна(только непонятно, на кой там нужны указатели) и вызывать ее можно для любых типов. Ну а если пользователь этой функции не знает, какие у него типы (то есть передает void*) то это его проблемы, что мы не оправдали его ожидания.
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
24.02.2013, 23:39  [ТС]     универсальный указатель #14

Не по теме:

C++
1
2
3
4
5
6
7
8
const int n=10;
    int arr [n];
    memset(arr,10,sizeof(arr));//почему это не работает?
    memset(arr,0,sizeof(arr));// а это работает?
    for (int i=0;i<n;i++)
    {
        cout << arr[i] << " ";
    }
memset(arr,10,sizeof(arr)); - в чем ошибка ?



выше сказанное связано с темой?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 23:41     универсальный указатель
Еще ссылки по теме:

Преобразование в указатель на указатель на константу - C++
В упор не могу понять правила которые приводит Дьюхерст для преобразований &quot;многоуровневых&quot; указателей. (Дьюхерст &quot;Скользкие места...

Указатель на указатель заполнение матрицы - C++
Напишите как самому вбивать матрицу скок на скока и каждый элемент в нем (заранее спасибо)!

Зачем использовать Указатель на указатель? - C++
Подскажите зачем использовать Указатель на указатель? И как работают двумерные массивы за счет указателей?

Указатель на указатель внутри структуры - C++
Приветствую. Есть 2 структуры: enum category { Technical, History, Fiction }; struct BOOK { char author; char name; int...

Указатель на указатель заполнение матрицы - C++
Помогите как самому вбивать матрицу скоко на скоко и элементы этой матрицы ( без функций ) используя только &lt;iostream&gt;. (помощь)


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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
24.02.2013, 23:41     универсальный указатель #15
Цитата Сообщение от fuelcs Посмотреть сообщение
можно пример связки memset и void* ?
обнулить участок памяти, начиная с некоего адреса. (Из чьей-то лабы драйвера экрана)
C++
1
2
3
4
5
6
7
#define VIDEO_WIDTH 80    //ширина экрана
#define VIDEO_HEIGHT 25   //высота экрана
#define VIDEO_RAM 0xb8000 //адрес видеопамяти
void clear()//Очистка экрана
{
 memset(VIDEO_RAM, 0, VIDEO_WIDTH*VIDEO_HEIGHT);
}
Yandex
Объявления
24.02.2013, 23:41     универсальный указатель
Ответ Создать тему
Опции темы

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