Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
Здравствуйте, Creater, Вы писали:
C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
Как используя указатель на тип void изменять значения полей? Никак. Или я вопрос не правильно понял?
Здравствуйте, Creater, Вы писали:
C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
приводи указатель на void к указателю на структуру
Здравствуйте, Creater, Вы писали:
C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
#include "stdafx.h"
#include <malloc.h>
#include <new>
class Test
{
public:
Test() : x(0), y(0) {}
virtual ~Test() {}
public:
int x;
short y;
};
int main(int argc, char* argv[])
{
void* p = malloc(sizeof(Test));
new (p) Test();
int Test::* refX = &Test::x;
short Test::* refY = &Test::y;
int offsetX;
int offsetY;
__asm
{
push refX
pop offsetX
push refY
pop offsetY
}
*(int*)(((char*)p) + offsetX) = 1;
*(short*)(((char*)p) + offsetY) = 2;
((Test*)p)->~Test();
free(p);
return 0;
}
Здравствуйте, Creater, Вы писали:
C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
Вот так. Только зачем? Плохо это.
class MyClass
{
public:
int m_a;
};
.....
void * vp;
vp = reinterpret_cast<void*>(new MyClass);
MyClass * pmc = reinterpret_cast<MyClass*>(vp);
pmc->m_a = 10;
delete vp; // Ба-бах! От такого кода умирают с голоду.
Здравствуйте, rus blood, Вы писали:
SW>>В общем случае sizeof(int) != sizeof(void*). ИМХО, на Itanium разойдётся RB>А при чем тут void* конкретно в этом приведенном куске???
/* Занудно */ Попытка запихнуть 64 битный указатель в 32 битный int.
Здравствуйте, Аноним, Вы писали:
А>А код на АСМе и всё , что после него обяхательно?
А>Не думайте , что я извращенец, но мне без этого никак не обойтись.
Скорее всего, если ты расскажешь поподробнее, подскажут другое решение — без "извращений".
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Объясняю зачем мне это надо
От:
Аноним
Дата:
02.07.04 15:36
Оценка:
В общем я пишу игру, у меня есть много разных классов : это различные объекты, у каждого объекта есть как минимум две функции DoRender(); и DoProceed(); первый отвечает за отрисовку , а второй за искуственный интелект + анализ текущего кол-ва здоровья и т.д., в процессе игры надо динамически создавать объекты, и вот для этого мне это и надо было, я думал сделать массив указателей на void* и динамически выделять память для объектов, а потом пробегаться по массиву и делать DoProceed(); у каждого объекта, в конце цикла пробегаться по массиву и делать DoRender(); для отрисовки.... Не делать же мне массив указателей для каждого типа объекта... У меня уже около 76 описано...
Здравствуйте, <Аноним>, Вы писали:
А>В общем я пишу игру, у меня есть много разных классов : это различные объекты, у каждого объекта есть как минимум две функции DoRender(); и DoProceed(); первый отвечает за отрисовку , а второй за искуственный интелект + анализ текущего кол-ва здоровья и т.д., в процессе игры надо динамически создавать объекты, и вот для этого мне это и надо было, я думал сделать массив указателей на void* и динамически выделять память для объектов, а потом пробегаться по массиву и делать DoProceed(); у каждого объекта, в конце цикла пробегаться по массиву и делать DoRender(); для отрисовки.... Не делать же мне массив указателей для каждого типа объекта... У меня уже около 76 описано...
Ну так можно (нужно ) выделмить общую функциональность в базовый (возможно абстрактный) класс
class CGameObject
{
// Данные + Методыpublic:
// Методыvirtual void DoRender(...) = 0;
virtual void DoProceeed(...) = 0;
};
потом делать 76 производных классов и вуаля! Наслаждаться бенефитами виртуальных функций.
HgLab: Mercurial Server and Repository Management for Windows
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, <Аноним>, Вы писали:
А>>В общем я пишу игру, у меня есть много разных классов : это различные объекты, у каждого объекта есть как минимум две функции DoRender(); и DoProceed(); первый отвечает за отрисовку , а второй за искуственный интелект + анализ текущего кол-ва здоровья и т.д., в процессе игры надо динамически создавать объекты, и вот для этого мне это и надо было, я думал сделать массив указателей на void* и динамически выделять память для объектов, а потом пробегаться по массиву и делать DoProceed(); у каждого объекта, в конце цикла пробегаться по массиву и делать DoRender(); для отрисовки.... Не делать же мне массив указателей для каждого типа объекта... У меня уже около 76 описано...
Н>Ну так можно (нужно ) выделмить общую функциональность в базовый (возможно абстрактный) класс
Н>
Н>class CGameObject
Н>{
Н> // Данные + Методы
Н>public:
Н> // Методы
Н> virtual void DoRender(...) = 0;
Н> virtual void DoProceeed(...) = 0;
Н>};
Н>
Н>потом делать 76 производных классов и вуаля! Наслаждаться бенефитами виртуальных функций.
Хмм... насчёт базового класса я уже думал, но о виртуальных функциях нет, объясни поподробнее, что мне надо будет делать потом, создать массив указателей на базовый класс и .... ?
Здравствуйте, Creater, Вы писали:
C>Хмм... насчёт базового класса я уже думал, но о виртуальных функциях нет, объясни поподробнее, что мне надо будет делать потом, создать массив указателей на базовый класс и .... ?
Если ты в этой ситауации не подумал о виртуальных функциях, то тебе лучше засесть за более углубленное изучение С++
Здравствуйте, Creater, Вы писали:
C>Здравствуйте, Нахлобуч, Вы писали:
Н>>Ну так можно (нужно ) выделмить общую функциональность в базовый (возможно абстрактный) класс
Н>>
Н>>class CGameObject
Н>>{
Н>> // Данные + Методы
Н>>public:
Н>> // Методы
Н>> virtual void DoRender(...) = 0;
Н>> virtual void DoProceeed(...) = 0;
Н>>};
Н>>
Н>>потом делать 76 производных классов и вуаля! Наслаждаться бенефитами виртуальных функций.
C>Хмм... насчёт базового класса я уже думал, но о виртуальных функциях нет, объясни поподробнее, что мне надо будет делать потом, создать массив указателей на базовый класс и .... ?
...вызывать необходимые функции в необходимый момент, ессесно.
HgLab: Mercurial Server and Repository Management for Windows
Здравствуйте, Creater, Вы писали:
C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
Если я правильно понял вопрос, то есть такой шаблон проектирования, называется "Фабрика" (Factory). Как правильно заметили отвечавшие, Вам стоит углубиться в изучение С++, поскольку знание даже простых принципов С++, таких, как наследование, виртуальные методы и т.п., сразу же подталкивает к ответу на Ваш вопрос...