void*
От: Creater  
Дата: 02.07.04 10:46
Оценка:
Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.
Re: void*
От: kvas Россия  
Дата: 02.07.04 10:49
Оценка:
Здравствуйте, Creater, Вы писали:

C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.


Как используя указатель на тип void изменять значения полей? Никак. Или я вопрос не правильно понял?
Re: void*
От: korzhik Россия  
Дата: 02.07.04 10:51
Оценка:
Здравствуйте, Creater, Вы писали:

C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.


приводи указатель на void к указателю на структуру
Re: Извращаться....
От: rus blood Россия  
Дата: 02.07.04 11:17
Оценка: :)
Здравствуйте, 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;
}
Имею скафандр — готов путешествовать!
Re: void*
От: Sir Wiz Россия  
Дата: 02.07.04 11:23
Оценка:
Здравствуйте, 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; // Ба-бах! От такого кода умирают с голоду.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Извращаться....
От: Sir Wiz Россия  
Дата: 02.07.04 11:36
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>
RB>    void* p = malloc(sizeof(Test));
RB>    new (p) Test();

RB>    int    Test::* refX = &Test::x;
RB>    short    Test::* refY = &Test::y;
RB>    int    offsetX;
RB>    int    offsetY;

RB>    __asm
RB>    { 
RB>        push refX
RB>        pop offsetX
RB>        push refY
RB>        pop offsetY
RB>    }

RB>

Мощно завернул!

В общем случае sizeof(int) != sizeof(void*). ИМХО, на Itanium разойдётся
... << RSDN@Home 1.1.3 stable >>
Re[3]: Извращаться....
От: rus blood Россия  
Дата: 02.07.04 11:45
Оценка:
Здравствуйте, Sir Wiz, Вы писали:

SW>Здравствуйте, rus blood, Вы писали:


RB>>
.............
RB>>

SW>Мощно завернул!

SW>В общем случае sizeof(int) != sizeof(void*). ИМХО, на Itanium разойдётся


А при чем тут void* конкретно в этом приведенном куске???
Имею скафандр — готов путешествовать!
Re[4]: Извращаться....
От: Sir Wiz Россия  
Дата: 02.07.04 11:55
Оценка:
Здравствуйте, rus blood, Вы писали:

SW>>В общем случае sizeof(int) != sizeof(void*). ИМХО, на Itanium разойдётся

RB>А при чем тут void* конкретно в этом приведенном куске???
/* Занудно */ Попытка запихнуть 64 битный указатель в 32 битный int.
... << RSDN@Home 1.1.3 stable >>
Re[5]: Извращаться....
От: rus blood Россия  
Дата: 02.07.04 12:12
Оценка:
SW>/* Занудно */ Попытка запихнуть 64 битный указатель в 32 битный int.

Где? Пальцем ткни...
Имею скафандр — готов путешествовать!
Re[6]: Извращаться....
От: Sir Wiz Россия  
Дата: 02.07.04 12:34
Оценка:
Здравствуйте, rus blood, Вы писали:


SW>>/* Занудно */ Попытка запихнуть 64 битный указатель в 32 битный int.

RB>Где? Пальцем ткни...
int Test::*    refX;
int    offsetX;
__asm
{
    push refX
    pop offsetX
}

Гипотетически sizeof(int Test::*) != sizeof(int)
... << RSDN@Home 1.1.3 stable >>
Re[7]: Извращаться....
От: rus blood Россия  
Дата: 02.07.04 12:36
Оценка:
Здравствуйте, Sir Wiz, Вы писали:

SW>Здравствуйте, rus blood, Вы писали:



SW>>>/* Занудно */ Попытка запихнуть 64 битный указатель в 32 битный int.

RB>>Где? Пальцем ткни...
SW>
SW>int Test::*    refX;
SW>int    offsetX;
SW>__asm
SW>{
SW>    push refX
SW>    pop offsetX
SW>}
SW>

SW>Гипотетически sizeof(int Test::*) != sizeof(int)

Да, верно. Возможно такой вариант.
Ок, заменим тип offsetX на int*.
Имею скафандр — готов путешествовать!
Re[2]: Извращаться....
От: Аноним  
Дата: 02.07.04 14:13
Оценка:
А код на АСМе и всё , что после него обяхательно?


Не думайте , что я извращенец, но мне без этого никак не обойтись.
Re[3]: Извращаться....
От: rus blood Россия  
Дата: 02.07.04 14:15
Оценка:
А>......без этого никак не обойтись.

А поподробнее ?
Имею скафандр — готов путешествовать!
Re[3]: Извращаться....
От: LaptevVV Россия  
Дата: 02.07.04 14:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А код на АСМе и всё , что после него обяхательно?



А>Не думайте , что я извращенец, но мне без этого никак не обойтись.

Скорее всего, если ты расскажешь поподробнее, подскажут другое решение — без "извращений".
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Объясняю зачем мне это надо
От: Аноним  
Дата: 02.07.04 15:36
Оценка:
В общем я пишу игру, у меня есть много разных классов : это различные объекты, у каждого объекта есть как минимум две функции DoRender(); и DoProceed(); первый отвечает за отрисовку , а второй за искуственный интелект + анализ текущего кол-ва здоровья и т.д., в процессе игры надо динамически создавать объекты, и вот для этого мне это и надо было, я думал сделать массив указателей на void* и динамически выделять память для объектов, а потом пробегаться по массиву и делать DoProceed(); у каждого объекта, в конце цикла пробегаться по массиву и делать DoRender(); для отрисовки.... Не делать же мне массив указателей для каждого типа объекта... У меня уже около 76 описано...
Re[2]: Объясняю зачем мне это надо
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 02.07.04 15:43
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>В общем я пишу игру, у меня есть много разных классов : это различные объекты, у каждого объекта есть как минимум две функции 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
Re[3]: Объясняю зачем мне это надо
От: Creater  
Дата: 02.07.04 16:27
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Здравствуйте, <Аноним>, Вы писали:


А>>В общем я пишу игру, у меня есть много разных классов : это различные объекты, у каждого объекта есть как минимум две функции DoRender(); и DoProceed(); первый отвечает за отрисовку , а второй за искуственный интелект + анализ текущего кол-ва здоровья и т.д., в процессе игры надо динамически создавать объекты, и вот для этого мне это и надо было, я думал сделать массив указателей на void* и динамически выделять память для объектов, а потом пробегаться по массиву и делать DoProceed(); у каждого объекта, в конце цикла пробегаться по массиву и делать DoRender(); для отрисовки.... Не делать же мне массив указателей для каждого типа объекта... У меня уже около 76 описано...


Н>Ну так можно (нужно ) выделмить общую функциональность в базовый (возможно абстрактный) класс


Н>
Н>class CGameObject
Н>{
Н>    // Данные + Методы
Н>public:
Н>    // Методы
Н>    virtual void DoRender(...) = 0;
Н>    virtual void DoProceeed(...) = 0;
Н>};
Н>


Н>потом делать 76 производных классов и вуаля! Наслаждаться бенефитами виртуальных функций.


Хмм... насчёт базового класса я уже думал, но о виртуальных функциях нет, объясни поподробнее, что мне надо будет делать потом, создать массив указателей на базовый класс и .... ?
Re[4]: Объясняю зачем мне это надо
От: rus blood Россия  
Дата: 02.07.04 16:30
Оценка:
Здравствуйте, Creater, Вы писали:

C>Хмм... насчёт базового класса я уже думал, но о виртуальных функциях нет, объясни поподробнее, что мне надо будет делать потом, создать массив указателей на базовый класс и .... ?


Если ты в этой ситауации не подумал о виртуальных функциях, то тебе лучше засесть за более углубленное изучение С++
Имею скафандр — готов путешествовать!
Re[4]: Объясняю зачем мне это надо
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 02.07.04 16:34
Оценка:
Здравствуйте, Creater, Вы писали:

C>Здравствуйте, Нахлобуч, Вы писали:


Н>>Ну так можно (нужно ) выделмить общую функциональность в базовый (возможно абстрактный) класс


Н>>
Н>>class CGameObject
Н>>{
Н>>    // Данные + Методы
Н>>public:
Н>>    // Методы
Н>>    virtual void DoRender(...) = 0;
Н>>    virtual void DoProceeed(...) = 0;
Н>>};
Н>>


Н>>потом делать 76 производных классов и вуаля! Наслаждаться бенефитами виртуальных функций.


C>Хмм... насчёт базового класса я уже думал, но о виртуальных функциях нет, объясни поподробнее, что мне надо будет делать потом, создать массив указателей на базовый класс и .... ?


...вызывать необходимые функции в необходимый момент, ессесно.
HgLab: Mercurial Server and Repository Management for Windows
Re: void*
От: x84 Россия  
Дата: 02.07.04 16:48
Оценка:
Здравствуйте, Creater, Вы писали:

C>Как используя указатель на тип void динамически выделять память для разных классов и изменять значения полей? У меня компилятор пишет, что указатель должен указывать на структуру или класс во время компиляции.


Если я правильно понял вопрос, то есть такой шаблон проектирования, называется "Фабрика" (Factory). Как правильно заметили отвечавшие, Вам стоит углубиться в изучение С++, поскольку знание даже простых принципов С++, таких, как наследование, виртуальные методы и т.п., сразу же подталкивает к ответу на Ваш вопрос...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.