Проблемы с указателями
От: Аноним  
Дата: 06.12.05 07:01
Оценка:
Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от 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;
Re: Проблемы с указателями
От: andrij Украина  
Дата: 06.12.05 07:59
Оценка:
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 обращаться к различным данным?
Или может еще как-нибудь можно сделать?
Re[3]: Проблемы с указателями
От: andrij Украина  
Дата: 06.12.05 10:20
Оценка:
On Tue, 06 Dec 2005 12:11:16 +0200, wrote:

> Я думал про наследство MyData2 от MyData1, в этом случае можно будет ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным?

> Или может еще как-нибудь можно сделать?

можно и через наследование, но, помоему, ето менее удобно — вам придетса при каждои использовании использовать приведение типов, а при передаче такого указателя в ф-цию — знать к какому именно типу привести уазатель, и всегда писать етод код, либо польморфизмом етого достич трудно, и ето тоже будет избиточно ....

а для класа где все в одном можно написать оператори приведения типов — и больше кода спрятать в реализацию такого класа.
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re: Проблемы с указателями
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 06.12.05 11:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от iType обращаться к различным данным.


А может стоило правильно спроектировать и возложить это все на виртуальные функции(если Вы конечно не на pure C пишете)?
Re: Проблемы с указателями
От: my_d  
Дата: 06.12.05 11:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от 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;
А>

Попробуй в блоке else переназначить указатель на необходимую структуру. Потом, если надо, переназначь обратно. А межешь завести второй указатель и использовать вместо "p1->value".
Re: Проблемы с указателями
От: Аноним  
Дата: 06.12.05 12:55
Оценка:
Здравствуйте, Аноним, Вы писали:

void* p;
Re[2]: Проблемы с указателями
От: andrij Украина  
Дата: 06.12.05 12:59
Оценка:
On Tue, 06 Dec 2005 14:55:27 +0200, wrote:

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

>
> void* p;

— очевидное решение — как на него не указал никто досихпор
Posted via RSDN NNTP Server 1.9
make it simple as possible, but not simpler
Re: Проблемы с указателями
От: anidal  
Дата: 06.12.05 13:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть две структуры и мне надо сделать указатель, который может ссылаться на обе структуры, чтобы в зависимости от 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;
А>



Последние 4 строчки надо писать так:
if (((struct MyData1*)p1)->iType == 1)
csTemp = ((struct MyData1*)p1)->str;
else
i3 = ((struct MyData2*)p1)->value;
А еще лучше создать структуру

struct MySuperData {
int iType;

}; и приводить указатель для идентивикации типа к ней.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.