Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
#1

Привести указатель на класс к указателю на void - C++

12.10.2015, 10:08. Просмотров 668. Ответов 22
Метки нет (Все метки)

Хай
http://www.cyberforum.ru/cpp-beginners/thread818681.html
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
#pragma once
#include "list.h";
#include "Print.h";
 
 
class Robot
{
public:
    Robot();
    ~Robot();
    template<typename T>
    void Set(T p)
    {
        if (Header == NULL)
        {
            list *l = new list(NULL,NULL,(void*)&p);
            Header = Last = l;
        }
        else
        {
            list *l = new list(NULL, Last, (void*)&p);
            Last = l;
        }
    }
    template <typename Ppr,typename Pdata>
    void PrintAll()
    {
        MyPrint *PointPrint;
        PointPrint = new Ppr;
        list *t = Header;
        while (t)
        {
            PointPrint->Pr((Pdata&)t->data);//необходимо преобразовать void * в Rose;
        }
    }
private:
 
};
 
Robot::Robot()
{
}
 
Robot::~Robot()
{
    if (Header!=NULL)
    {
        list *t = Header;
        while (t)
        {
            delete t;
        }
    }
}
list *l = new list(NULL,NULL,(void*)&p); привожу Rose к void *, но потом мне нужно сделать обратное, void * привести к Rose. Подскажите как это сделать, а то компилятор ругается. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2015, 10:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Привести указатель на класс к указателю на void (C++):

Функция принимает указатель на void и возвращает указатель на int
Запишите прототип функции, которая принимает указатель на void и возвращает...

Массив по указателю void*
Как сравнивать элементы массива имея указатель void* на него, размер массива и...

Преобразование указателя void к указателю на структуру
Здравствуйте! Можете объяснить эти строки в программе? int cmp(const void*...

Доступ к пользовательскому класу по void указателю
Здравствуйте, есть указатель void* pointer = 0; //указатель на объект ...

Привести string к void*
Здравствуйте. Как привести переменную типа string к void*? спасибо.

22
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
12.10.2015, 10:20 #2
Что за Rose?
0
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 10:28  [ТС] #3
nmcf, класс
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
12.10.2015, 12:15 #4
Ну приводи так же, как к void. Там есть иерархия какая-то, общий предок?
0
SatanaXIII
Супер-модератор
Эксперт С++
5765 / 2763 / 374
Регистрация: 01.11.2011
Сообщений: 6,717
Завершенные тесты: 1
12.10.2015, 12:17 #5
Цитата Сообщение от SanychBY Посмотреть сообщение
но потом не нужно сделать
Не нужно или мне нужно?
0
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 12:33  [ТС] #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Не нужно или мне нужно?
Мне нужно

Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Ну приводи так же, как к void. Там есть иерархия какая-то, общий предок?
list это класс списка, Robot работает с этим списком (добавляет новый элемент, печатает его). Объект класса Rose я помещаю в список с помощью Robot.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
12.10.2015, 12:38 #7
C++
1
2
3
Rose * ptr = //что то там
void * vptr = reinterpret_cast<void*>(ptr);
Rose * nptr = reinterpret_cast<Rose*>(vptr);
а откуда вообще Rose взяля О_о ?
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
12.10.2015, 12:39 #8
Почему тип элемента списка не сделать указателем на Rose? Зачем там void?

Добавлено через 46 секунд
aLarman, а простое приведение как с void и примере не сработает, что ли?
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
12.10.2015, 12:52 #9
Цитата Сообщение от nmcf Посмотреть сообщение
aLarman, а простое приведение как с void и примере не сработает, что ли?
ну как бе си стайл си++ стайл
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
12.10.2015, 12:58 #10
void* уже не C++ стайл.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
12.10.2015, 13:15 #11
nmcf, просветите что тогда должно быть?
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,331
12.10.2015, 13:28 #12
Указатель на класс предок, наверное. Типа object в C#.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
12.10.2015, 13:56 #13
nmcf, мы о разных вещах говорим, ТС попросил как перевести из конкретного типа в войд и обратно, я привел пример, а как должно быть на самом деле я не вникал
0
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 13:59  [ТС] #14
Цитата Сообщение от nmcf Посмотреть сообщение
Почему тип элемента списка не сделать указателем на Rose? Зачем там void?
Хочется создать что-то на подобии библиотеки. void позволяет не привязываться к типу данных.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
12.10.2015, 14:00 #15
почитайте тогда про идиому TypeErasure
0
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:12  [ТС] #16
Цитата Сообщение от nmcf Посмотреть сообщение
Почему тип элемента списка не сделать указателем на Rose? Зачем там void?
Хочется создать что-то на подобии библиотеки. void позволяет не привязываться к типу данных.

Добавлено через 8 минут
Вот класс Rose
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "Flower.h";
#include "Packing.h"
class Rose :public Flower
{
public:
    Rose()
    {
        cout << "Constructor Rose" << endl;
    }
    ~Rose()
    {
        cout << "Destr Rose" << endl;
    }
    Packing Pack;
};
вот list
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
#pragma once
#include <iostream>
 
 
class list
{
 
public:
    list(list *n, list *p, void *d);
    ~list();
    
    list *next;
    list *prev;
    void *data;
    void Set(list *n, list *p, void *d);
    void* Get();
    
private:
 
};
static list *Header = NULL;
static list *Last = NULL;
 
list::list(list *n, list *p, void *d)
{
    this->Set(n, p, d);
}
 
list::~list()
{
    delete data;
}
 
void list::Set(list *n, list *p, void *d)
{
    this->next = n;
    this->prev = p;
    this->data = d;
}
void * list::Get()
{
    return this->data;
}
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename Ppr,typename Pdata>
    void PrintAll()
    {
        MyPrint *PointPrint;
        PointPrint = new Ppr;
        list *t = Header;
        while (t)
        {
            PointPrint->Pr((Pdata&)t->data);//необходимо преобразовать void * в Rose;
        }
    }
как то надо просто прописать правильное преобразование
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:18 #17
Что мешает сделать класс list шаблонным?
0
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:19  [ТС] #18
castaway, как иерархия классов относится к теме преобразования?
0
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:21 #19
Цитата Сообщение от SanychBY Посмотреть сообщение
castaway, как иерархия классов относится к теме преобразования?
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
0
SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:24  [ТС] #20
Цитата Сообщение от castaway Посмотреть сообщение
Сообщение от SanychBY
castaway, как иерархия классов относится к теме преобразования?
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
Цитата Сообщение от castaway Посмотреть сообщение
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
Просто не вижу как это исправит проблему. Поле void * data все равно не исчезнет и придется приводить.
0
12.10.2015, 14:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 14:24
Привет! Вот еще темы с решениями:

Не удается запустить указатель метода по указателю класса
Первый класс - бесцветная (белая) линия, Второй класс - цветная линия. Если...

Указатель на void
Как можно сделать универсальную функцию, которая принимает указатель на...

Как лучше присвоить указателю на указатель адрес массива
Во первых, как ЛУЧШЕ присвоить указателю на указатель адрес массива. int num =...

Указатель типа void
Добрый день. enum Type { Double, Int, Float }; void func(int k,enum Type...


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

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

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