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

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

Войти
Регистрация
Восстановить пароль
 
 
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
#1

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

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

Хай
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. Подскажите как это сделать, а то компилятор ругается. Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4484 / 3822 / 1289
Регистрация: 14.04.2014
Сообщений: 15,003
12.10.2015, 10:20     Привести указатель на класс к указателю на void #2
Что за Rose?
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 10:28  [ТС]     Привести указатель на класс к указателю на void #3
nmcf, класс
nmcf
4484 / 3822 / 1289
Регистрация: 14.04.2014
Сообщений: 15,003
12.10.2015, 12:15     Привести указатель на класс к указателю на void #4
Ну приводи так же, как к void. Там есть иерархия какая-то, общий предок?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2583 / 235
Регистрация: 01.11.2011
Сообщений: 6,391
Завершенные тесты: 1
12.10.2015, 12:17     Привести указатель на класс к указателю на void #5
Цитата Сообщение от SanychBY Посмотреть сообщение
но потом не нужно сделать
Не нужно или мне нужно?
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 12:33  [ТС]     Привести указатель на класс к указателю на void #6
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Не нужно или мне нужно?
Мне нужно

Добавлено через 2 минуты
Цитата Сообщение от nmcf Посмотреть сообщение
Ну приводи так же, как к void. Там есть иерархия какая-то, общий предок?
list это класс списка, Robot работает с этим списком (добавляет новый элемент, печатает его). Объект класса Rose я помещаю в список с помощью Robot.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
12.10.2015, 12:38     Привести указатель на класс к указателю на void #7
C++
1
2
3
Rose * ptr = //что то там
void * vptr = reinterpret_cast<void*>(ptr);
Rose * nptr = reinterpret_cast<Rose*>(vptr);
а откуда вообще Rose взяля О_о ?
nmcf
4484 / 3822 / 1289
Регистрация: 14.04.2014
Сообщений: 15,003
12.10.2015, 12:39     Привести указатель на класс к указателю на void #8
Почему тип элемента списка не сделать указателем на Rose? Зачем там void?

Добавлено через 46 секунд
aLarman, а простое приведение как с void и примере не сработает, что ли?
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
12.10.2015, 12:52     Привести указатель на класс к указателю на void #9
Цитата Сообщение от nmcf Посмотреть сообщение
aLarman, а простое приведение как с void и примере не сработает, что ли?
ну как бе си стайл си++ стайл
nmcf
4484 / 3822 / 1289
Регистрация: 14.04.2014
Сообщений: 15,003
12.10.2015, 12:58     Привести указатель на класс к указателю на void #10
void* уже не C++ стайл.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
12.10.2015, 13:15     Привести указатель на класс к указателю на void #11
nmcf, просветите что тогда должно быть?
nmcf
4484 / 3822 / 1289
Регистрация: 14.04.2014
Сообщений: 15,003
12.10.2015, 13:28     Привести указатель на класс к указателю на void #12
Указатель на класс предок, наверное. Типа object в C#.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
12.10.2015, 13:56     Привести указатель на класс к указателю на void #13
nmcf, мы о разных вещах говорим, ТС попросил как перевести из конкретного типа в войд и обратно, я привел пример, а как должно быть на самом деле я не вникал
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 13:59  [ТС]     Привести указатель на класс к указателю на void #14
Цитата Сообщение от nmcf Посмотреть сообщение
Почему тип элемента списка не сделать указателем на Rose? Зачем там void?
Хочется создать что-то на подобии библиотеки. void позволяет не привязываться к типу данных.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
12.10.2015, 14:00     Привести указатель на класс к указателю на void #15
почитайте тогда про идиому TypeErasure
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:12  [ТС]     Привести указатель на класс к указателю на void #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;
        }
    }
как то надо просто прописать правильное преобразование
castaway
Эксперт С++
4870 / 3009 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:18     Привести указатель на класс к указателю на void #17
Что мешает сделать класс list шаблонным?
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:19  [ТС]     Привести указатель на класс к указателю на void #18
castaway, как иерархия классов относится к теме преобразования?
castaway
Эксперт С++
4870 / 3009 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:21     Привести указатель на класс к указателю на void #19
Цитата Сообщение от SanychBY Посмотреть сообщение
castaway, как иерархия классов относится к теме преобразования?
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 14:24     Привести указатель на класс к указателю на void
Еще ссылки по теме:

C++ Указатель типа void c++
Указатель типа void C++
Преобразование указателя void к указателю на структуру C++
Не удается запустить указатель метода по указателю класса C++
Доступ к пользовательскому класу по void указателю C++

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

Или воспользуйтесь поиском по форуму:
SanychBY
 Аватар для SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:24  [ТС]     Привести указатель на класс к указателю на void #20
Цитата Сообщение от castaway Посмотреть сообщение
Сообщение от SanychBY
castaway, как иерархия классов относится к теме преобразования?
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
Цитата Сообщение от castaway Посмотреть сообщение
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
Просто не вижу как это исправит проблему. Поле void * data все равно не исчезнет и придется приводить.
Yandex
Объявления
12.10.2015, 14:24     Привести указатель на класс к указателю на void
Ответ Создать тему
Опции темы

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