Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным.
Подскажите как правильно сделать
struct MyData1 {
int iType;
CString str;
};
struct MyData2 {
int iType;
int value1, value2;
};
MyData1* md1 = new MyData1;
MyData2* md2 = new MyData2;
md1->iType = 1;
md1->str = "123";
md2->iType = 2;
md2->value = 3;
void* p1;
p1 = md2;
CString csTemp;
int i3;
if (p1->iType == 1)
csTemp = p1->str;
else
i3 = p1->value;
On Tue, 06 Dec 2005 09:01:08 +0200, wrote:
> Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным. > Подскажите как правильно сделать >
> struct MyData1 {
> int iType;
> CString str;
> };
> struct MyData2 {
> int iType;
> int value1, value2;
> };
> MyData1* md1 = new MyData1;
> MyData2* md2 = new MyData2;
>
Ты, наверное, пытаешса сделать так на зиваемый вартайп. Тогда ето должна бить одна структура, которая будеть
иметь поле типа (твое int iType) и юнион + поля с даними у которых есть конструкторы (они не пролезут в юнион ) — штоби были все нужные типы
struct var_type
{
int iType;
union
{
int iChar;
char chData;
char*chptrData;
/* ... */
/* All POD data*/
};
std::string strData;
};
структура выходит избыточной, но в ней без проблем можно хранить переменные всех нужных типов
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re[2]: Проблемы с указателями
От:
Аноним
Дата:
06.12.05 10:11
Оценка:
Здравствуйте, andrij, Вы писали:
A>Ты, наверное, пытаешса сделать так на зиваемый вартайп. Тогда ето должна бить одна структура, которая будеть A>иметь поле типа (твое int iType) и юнион + поля с даними у которых есть конструкторы (они не пролезут в юнион ) — штоби были все нужные типы A>структура выходит избыточной, но в ней без проблем можно хранить переменные всех нужных типов
Спасибо за ответ, так работает.
Но у меня, наверное, будет нерационально использоваться память.
struct MyData1 {
int iType;
CString str;
};
struct MyData2 {
int iType;
CString str;
int value1[1000], value2[555];
};
Я думал про наследство MyData2 от MyData1, в этом случае можно будет ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным?
Или может еще как-нибудь можно сделать?
On Tue, 06 Dec 2005 12:11:16 +0200, wrote:
> Я думал про наследство MyData2 от MyData1, в этом случае можно будет ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным? > Или может еще как-нибудь можно сделать?
можно и через наследование, но, помоему, ето менее удобно — вам придетса при каждои использовании использовать приведение типов, а при передаче такого указателя в ф-цию — знать к какому именно типу привести уазатель, и всегда писать етод код, либо польморфизмом етого достич трудно, и ето тоже будет избиточно ....
а для класа где все в одном можно написать оператори приведения типов — и больше кода спрятать в реализацию такого класа.
Здравствуйте, Аноним, Вы писали:
А>Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным.
А может стоило правильно спроектировать и возложить это все на виртуальные функции(если Вы конечно не на pure C пишете)?
Здравствуйте, Аноним, Вы писали:
А>Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным. А>Подскажите как правильно сделать А>
Попробуй в блоке else переназначить указатель на необходимую структуру. Потом, если надо, переназначь обратно. А межешь завести второй указатель и использовать вместо "p1->value".
Здравствуйте, Аноним, Вы писали:
А>Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным. А>Подскажите как правильно сделать А>
Последние 4 строчки надо писать так:
if (((struct MyData1*)p1)->iType == 1)
csTemp = ((struct MyData1*)p1)->str;
else
i3 = ((struct MyData2*)p1)->value;
А еще лучше создать структуру
struct MySuperData {
int iType;
}; и приводить указатель для идентивикации типа к ней.