2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176

Хранение ссылки класса в указателе void*

07.02.2011, 14:48. Показов 2373. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, столкнулся с проблемой

если для зарезервированы типов int, long, ... все работает

C++
1
2
3
4
int q1 = 10;
void * v1 = new int();
v1 = (void*)q1; // делаем явное преобразование
q1 = (int)v1;   // делаем явное преобразование
но вот с собственными классами и классом string такой номер не проходит
C++
1
2
3
4
string s2 = "10";
void * v2 = new string();
v2 = (void*)s2; // невозможно преобразовать 'std::string' в 'void *'
s2 = (string)v2;// невозможно преобразовать 'void *' в 'std::string'
Помогите пожалуйста сохранять ссылки на класс в указатели void*
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2011, 14:48
Ответы с готовыми решениями:

Хранение и вызов функции с неопределенным количеством параметров в указателе
Необходимо создать класс который будет хранить в себе функции и сможет их вызывать Но как это сделать если нам не известны параметры...

System.Void из C# использоваться не может - для получения объекта типа void используйте typeof (void)
Изучаю с# по "Шилдт Г. - C# 4.0 полное руководство" При изучении конструктора возникла проблема: попытался запустить код на стр. 169, а...

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна найти в i-том элементе какую-то...

4
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
07.02.2011, 16:36
Цитата Сообщение от nchameleon Посмотреть сообщение
но вот с собственными классами и классом string такой номер не проходит
C++
1
2
3
4
string s2 = "10";
void * v2 = new string();
v2 = (void*)s2; // невозможно преобразовать 'std::string' в 'void *'
s2 = (string)v2;// невозможно преобразовать 'void *' в 'std::string'
У тебя и в первом случае сделано неверно.
C++
1
2
3
4
string s2 = "10";
void* v2 = static_cast<void*>(new string());
*static_cast<string*>(v2) = s2;    
s2 = *static_cast<string*>(v2);
Вот только зачем это могло понадобиться я честно говоря слабо себе представляю...
1
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176
07.02.2011, 17:53  [ТС]
большое спасибо за ответ, стало все понятно
----------------------------------------------------

пытаюсь сделать таблицу где будут храниться разные переменные, т.е. 1?2 столбец string, 3,4 long
но заранее не знаю где и сколько столбцов будет
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
07.02.2011, 18:04
Цитата Сообщение от nchameleon Посмотреть сообщение
пытаюсь сделать таблицу где будут храниться разные переменные, т.е. 1?2 столбец string, 3,4 long
не легче структурой с полями нужного типа и полем содержащим тип данных?
Code
1
2
3
4
5
6
7
struct MyVariant
{
int type;
string v_string;
long v_long;
.... //и т.д.
};
К стати VARIANT под виндой таким образом и представлен
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.02.2011, 18:19
Цитата Сообщение от nchameleon Посмотреть сообщение
если для зарезервированы типов int, long, ... все работает
У тебя работает, но совсем не то, что ты хочешь. В ссылке на void ты хранишь НЕ ССЫЛКУ на экземпляр int'а, а ЗНАЧЕНИЕ int'а.

Правильно писать так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
int q1 = 10;
void *v1;
 
/* Записали указатель на int */
v1 = (void*) &q1;
 
/* Прочитали указатель на int */
int *p;
p = (int*) v1;
 
/* Разыменовали указатель */
int i;
i = *p;
со string'ами всё так же

C
1
2
string s2 = "10";
void *v1 = (void*) &s2;
Хотя операция преобразования типа через круглые скобки являетя как бы конструкцией языка Си и как бы с точки зрения Си++ надо писать по пацански через static_cast, как написал rangerx

Хотя для твоей задачи более правильно писать так, как сделел oxotnik (правда более грамотным будет использование type + union (меньше памяти отжирается), но для начального этапа лучше делать понятнее, чем эффективнее. А с указателями таким способом хранить не советую. Ты в них слишком плохо разбираешься, а потому огребёшь ворох проблем
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2011, 18:19
Помогаю со студенческими работами здесь

Реализовать аналог `void *memmove(void *to, void *from, size_t n)`
Добрый день, подскажите пожалуйста, как реализовать такой метод самостоятельно? который копирует из одного массива в другой n элементов ...

Хранение в таблице phpMyAdmin ссылки на изображение
Здравствуйте. Подскажите пожалуйста как в таблице хранящейся на phpMyAdmin в специальном поле указать путь, где хранится картинка (например...

Метод класса void-функция, как параметр функции glfwSetScrollCallback(.)
Здравствуйте, кодеры. Появилась проблема. Использую GLSL и GLFW. У меня есть класс Game. Этот класс имеет метод void...

Хранение в list объектов класса
Пусть дан класс, содержащий два поля: ФИО и возраст. Методы ввода и вывода ФИО и возраста. Как использовать шаблонный класс list для...

Хранение неинициализированных объектов шаблонного класса
Допустим, есть шаблонный класс template &lt;typename T&gt; class SomeValue; который хранит в себе какое-то значение. И есть нешаблонный...


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

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

Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru