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

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

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

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

12.10.2015, 10:08. Просмотров 564. Ответов 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. Подскажите как это сделать, а то компилятор ругается. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2015, 10:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Привести указатель на класс к указателю на void (C++):

Как преобразовать указатель на класс к указателю на асбтрактный класс? - C++
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из него понятно. #include &lt;stdio.h&gt; ...

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

Массив по указателю void* - C++
Как сравнивать элементы массива имея указатель void* на него, размер массива и размер в байтах одного элемента?

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SanychBY
38 / 45 / 1
Регистрация: 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;
        }
    }
как то надо просто прописать правильное преобразование
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:18 #17
Что мешает сделать класс list шаблонным?
SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:19  [ТС] #18
castaway, как иерархия классов относится к теме преобразования?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:21 #19
Цитата Сообщение от SanychBY Посмотреть сообщение
castaway, как иерархия классов относится к теме преобразования?
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
SanychBY
38 / 45 / 1
Регистрация: 04.06.2013
Сообщений: 1,532
12.10.2015, 14:24  [ТС] #20
Цитата Сообщение от castaway Посмотреть сообщение
Сообщение от SanychBY
castaway, как иерархия классов относится к теме преобразования?
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
Цитата Сообщение от castaway Посмотреть сообщение
Никак. Мне просто интересно почему ты не хочешь решить проблему по другому.
Просто не вижу как это исправит проблему. Поле void * data все равно не исчезнет и придется приводить.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
12.10.2015, 14:27 #21
Цитата Сообщение от SanychBY Посмотреть сообщение
Просто не вижу как это исправит проблему. Поле void * data все равно не исчезнет и придется приводить.
Твой list хранит данные одного типа?
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
12.10.2015, 14:43 #22
C++
1
2
3
4
5
template<typename T>
class list
{
T * data;
};
Добавлено через 1 минуту
Цитата Сообщение от SanychBY Посмотреть сообщение
C++
1
2
template<typename T> 
void Set(T p)
и получите UB
в методе p будет локальной копией типа T (если он не указатель)
Цитата Сообщение от SanychBY Посмотреть сообщение
C++
1
list *l = new list(NULL,NULL,(void*)&p);
а вот тут сохраните адрес локалькой переменной

Добавлено через 24 секунды
не надо так
nmcf
5309 / 4629 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
12.10.2015, 14:45 #23
Есть же предок Flower, вот его указатель и использовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 14:45
Привет! Вот еще темы с ответами:

Указатель на void - C++
Как можно сделать универсальную функцию, которая принимает указатель на неопределенный тип, увеличивает значение на которое указывает этот...

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

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

Указатель void на структуру - C++
Есть некий тип структуры action. Для функции _beginthread третьим параметром требуется указатель на void. Как преобразовать структуру в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2015, 14:45
Ответ Создать тему
Опции темы

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