Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование типов

11K
20 августа 2005 года
FlyMouse
12 / / 13.08.2005
Какие существуют способы преобразования из указателя в составной тип? И возможно ли сделать функцию которая принмала указатель и возвращала объект:
class Profile
{TList *ObjectList;
AddObject(void *);
GetObject(int Count);
};

Profile::Profile()
{ObjectList=new TList;};

Profile::AddObject(?)
{ServerList-Add(Object);};

Profile::GetObject(int i)
{TObject *O = преобразование указателя из *ObjectList в составной тип;
return = O;};
299
20 августа 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by FlyMouse
Какие существуют способы преобразования из указателя в составной тип? И возможно ли сделать функцию которая принмала указатель и возвращала объект:
class Profile
{TList *ObjectList;
AddObject(void *);
GetObject(int Count);
};

Profile::Profile()
{ObjectList=new TList;};

Profile::AddObject(?)
{ServerList-Add(Object);};

Profile::GetObject(int i)
{TObject *O = преобразование указателя из *ObjectList в составной тип;
return = O;};


Я не понел? тебе нужно получить из указателя объект на который он указывает? Так поставь перед указателем звездочку и все.

488
20 августа 2005 года
Mоngооsе
465 / / 01.04.2005
Есть указатель любого типа, напр. void *v;

преобразование в нужный тип, напр. указатель на объект Profile:

(Profile *)v;
11K
21 августа 2005 года
FlyMouse
12 / / 13.08.2005
Цитата:
Originally posted by 3D Bob
Я не понел? тебе нужно получить из указателя объект на который он указывает? Так поставь перед указателем звездочку и все.



Profile::GetObject(int i)
{
TObject *O = (TObject *)ObjectList[0][Count];
return = O;//получается так?
};

1.1K
21 августа 2005 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by FlyMouse
Profile::GetObject(int i)
{
TObject *O = (TObject *)ObjectList[0][Count];
return = O; //получается так?
};



Во-первых не

 
Код:
TObject *O = (TObject *)ObjectList[0][Count];

а
 
Код:
TObject O = *((TObject *)ObjectList[0][Count]);


т.е. тебе дается указатель на объект, его нужно разадресовать.

Во-вторых что за двойная адресация у TList? Сами объекты получаются через свойство Items.

В-третих зачем тебе вообще нужно возвращать объект, возвращай указатель на него и работай с ним.
310
21 августа 2005 года
fellow
853 / / 17.03.2003
Из первоначального вопроса FlyMouse я понял, что на самом деле его цель - не приведения типов как таковые, а создание полиморфного контейнера.
Ясно, что такой контейнер можно реализовать уймой способов.
FlyMouse избрал нормальный со всех точек зрения путь - контейнер указателей на объекты.
Остаётся только уточнить: объекты, хранимые в контейнере, производные от одного какого-то базового типа или они не имеют общего предка в цепи наследования?
3
21 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by fellow
Из первоначального вопроса FlyMouse я понял, что на самом деле его цель - не приведения типов как таковые, а создание полиморфного контейнера.
Ясно, что такой контейнер можно реализовать уймой способов.


Да, похоже.

Цитата:
Originally posted by fellow
FlyMouse избрал нормальный со всех точек зрения путь - контейнер указателей на объекты.


Но в примере фигурирует void*, что ОЧЕНЬ плохо!
Не используйте void*!!!

Цитата:
Originally posted by fellow
Остаётся только уточнить: объекты, хранимые в контейнере, производные от одного какого-то базового типа или они не имеют общего предка в цепи наследования?


Теоретически не может быть неродственных объектов хранимых в одном контейнере. В противном случае - это ошибка проектирования.
Положите мне в коробку немного апельсинов, немного синего цвета, немного звуков "ля" и запаха жасмина... :)

310
21 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Green
Да, похоже.

Но в примере фигурирует void*, что ОЧЕНЬ плохо!
Не используйте void*!!!

Теоретически не может быть неродственных объектов хранимых в одном контейнере. В противном случае - это ошибка проектирования.
Положите мне в коробку немного апельсинов, немного синего цвета, немного звуков "ля" и запаха жасмина... :)



Ну вот, весь кайф мне обломал :D
Я как раз собирался в развитии темы FlyMouse'а носом наторкать в void* и в бардак в "коробке" :D :P ;)

13K
21 августа 2005 года
Nikolay86
8 / / 21.08.2005
Писано "на коленке", поэтому могут быть очепятки и/или недоработки. Но, по-идее, должно работать.

template <class T> class MyList
{
public:
MyList()
{ List = new TList; }
~MyList()
{ delete List; }

void AddObject(T *Ptr) // Добавляет элемент
{ List->Items.Add(Ptr); }
T * operator[](int Index) // Возвращает указанный элемент
{ return reinterpret_cast<T *>(List->Items[Index]); }

int Count() // Возвращает количество элементов
{ return List->Items.Count; }

protected:
TList * List;
};

Юзать так:

MyList<TMemo> P; // Здесь вместо TMemo - тот класс, который хотим хранить в списке

P.AddObject(new TMemo);
P.AddObject(new TMemo);
P.AddObject(new TMemo);

// ...

TMemo *R;
R = P[1]; // Получение объекта
310
21 августа 2005 года
fellow
853 / / 17.03.2003
М-да ужж.....
Тернистый путь м-ра Самоделкина aka Nikolay86....

А что? Стандартный vector пользовать не судьба?

13K
21 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by fellow
М-да ужж.....
Тернистый путь м-ра Самоделкина aka Nikolay86....

А что? Стандартный vector пользовать не судьба?



Ну, во-первых, у нас с STL взаимное неприятие. :)
А во-вторых, я FlyMouse знаю почти лично, и он с vector тоже не дружит...

310
21 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Nikolay86
Ну, во-первых, у нас с STL взаимное неприятие. :)
А во-вторых, я FlyMouse знаю почти лично, и он с vector тоже не дружит...



А что так?

13K
21 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by fellow
А что так?



Ну, если это вопрос про мое неприятие STL, тогда скажу. Я особо STL не изучал, т.к. она мне не понравилась чисто субъективно с первого взгляда :)
Особенно бесит std::string. Ну вот зачем было её шаблоном делать, я лично не понимаю... Мне по нраву больше библиотека Qt. IMHO, гораздо удобнее и функциональнее.

А что касается вопроса FlyMouse, то ему просто нужен TList объектов, но ему не хочется каждый раз писать reinterpret_cast.

Шаблон получился обычной оберткой вокруг TList, наверное лучше было бы сделать вообще макрос взамен перегруженного оператора [], но тогда товарищу FlyMouse пришлось бы объяснять, что такое макросы :) А я с рождения жутко ленивый...

Хотя, теперь наверное придется объяснять, что такое шаблоны :)

310
21 августа 2005 года
fellow
853 / / 17.03.2003
Ой! "Чисто субъективно" - мощный аргумент :)

Вот что получается: stl, видите ли, не нравится, но предложенное тобой решение - всё равно шаблон! Так не проще ли вместо всего, нагороженного тобой в "template <class T> class MyList" и далее, написать коротко и понятно: vector<TMemo*> Memoes и получить желаемое и причём без всяких reinterpret_cast?

Или уж предложил бы чисто Qt-шное решение, без TList :)
3
22 августа 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Nikolay86
Я особо STL не изучал, т.к. она мне не понравилась чисто субъективно с первого взгляда :)


Пять баллов!
"Что такое юг мы не знаем, но до неприятностей вы уже долетели..." :)

Цитата:
Originally posted by Nikolay86

Особенно бесит std::string. Ну вот зачем было её шаблоном делать, я лично не понимаю...


Ну std::string не шаблон, а вот std::basic_string - шаблон.
Зачем? Ты что-нибудь слышал про wide character ?
Думаю тебе следует подумать на досуге зачем вообще существуют шаблоны.

Цитата:
Originally posted by Nikolay86

Мне по нраву больше библиотека Qt. IMHO, гораздо удобнее и функциональнее.


А причем тут Qt? Я понимаю, еслиб ты ещё с boost-ом сравнивал... но Qt... это совсем из другой оперы.

Цитата:
Originally posted by Nikolay86

наверное лучше было бы сделать вообще макрос взамен перегруженного оператора []


Учитесь писать на С++, а не жалком С-подобном уродце.

Цитата:
Originally posted by Nikolay86

Хотя, теперь наверное придется объяснять, что такое шаблоны :)


А сумеешь? Тогда вперед, послушаем.

11K
22 августа 2005 года
FlyMouse
12 / / 13.08.2005
Originally posted by teran
Во-первых не
 
Код:
TObject *O = (TObject *)ObjectList[0][Count];
a TObject O = *((TObject *)ObjectList[0][Count]);


т.е. тебе дается указатель на объект, его нужно разадресовать.

 
Код:
TMyMemo * Profile::GetServer(int count)
{
      //TMyMemo * M = (TMyMemo *)ServerList->Items[count];так нормально работает
      TMyMemo M = *((TMyMemo *)ServerList[0][count]);//E2034 Cannot convert 'TMyMemo' to 'TMyMemo *'
      return M;
}

Во-вторых что за двойная адресация у TList? Сами объекты получаются через свойство Items.
[] - обращение к TList как к указателю, []-перегруженная оперция для доступа к списку

В-третих зачем тебе вообще нужно возвращать объект, возвращай указатель на него и работай с ним.
11K
22 августа 2005 года
FlyMouse
12 / / 13.08.2005
Originally posted by Nikolay86
Писано "на коленке", поэтому могут быть очепятки и/или недоработки

P.AddObject(new TMemo);

Пишет вот такую лабуду Could not find a match for 'TMemo::TMemo()'
Как теперь добавить метод для создания объекта из другого класса?
Код:
class Profile
        {
        public:
              TServer * GetServer(int count);
              TList *ServerList;
              Profile();
        };
        Profile::Profile()
              {ServerList = new TList;}
        TServer * Profile::GetServer(int count)
        {
              TServer * S = (TServer *)ServerList->Items[count];
              return S;
        }
11K
22 августа 2005 года
FlyMouse
12 / / 13.08.2005
Originally posted by fellow
Из первоначального вопроса FlyMouse я понял, что на самом деле его цель - не приведения типов как таковые, а создание полиморфного контейнера.
Ясно, что такой контейнер можно реализовать уймой способов.

Каких например? я вот думаю можно ли для этого создать вариантный массив из указателей? в С++ такие существуют?
310
22 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by FlyMouse
Каких например? я вот думаю можно ли для этого создать вариантный массив из указателей? в С++ такие существуют?



Я же сказал - используй vector.

Определись, объекты какого типа ты собираешься хранить в контейнере. Только, заклинаю, не пихай в контейнер объекты разных типов, не имеющих общего предка в цепочке наследования.

Если ты собираешься хранить объекты из библиотеки VCL, то сделай vector<TObject*>, или vector<TComponent*>, или vector<TControl*>.
В первом случае ты сможешь работать со всеми хранящимися в контейнере объектами как с TObject. Во втором случае - как с TComponent. А в третьем - как с TControl.
Ясно, что всякие явные приведения типов нежелательны, поскольку программирование на С++ в таких приведениях не нуждается.

Подробности в справке, а так же в толковых и грамотных (хотя и не настолько тривиальных) книгах Страуструпа и других умных авторов. [COLOR=tomato]Ни в коем случае не Архангельский!!![/COLOR] :D

585
22 августа 2005 года
honeybeer
297 / / 06.09.2004
Во-первых здрасте :D
Во-вторых, упаси вас Бог пользовать reinterpret_cast в приведениях типов, такого понаприводите - сами удивитесь. ИМХО, использовать его можно, но только в виде исключения.
2 terran
 
Код:
TObject O = *((TObject *)ObjectList[0][Count]);

как вы считаете, а не VCL объект ли этот TObject?
1.1K
22 августа 2005 года
teran
73 / / 15.04.2003
Цитата:
Originally posted by honeybeer
Во-первых здрасте :D
Во-вторых, упаси вас Бог пользовать reinterpret_cast в приведениях типов, такого понаприводите - сами удивитесь. ИМХО, использовать его можно, но только в виде исключения.
2 terran
 
Код:
TObject O = *((TObject *)ObjectList[0][Count]);

как вы считаете, а не VCL объект ли этот TObject?



Ага, извиняюсь, ошибся. Как я уже и говорил выше надо возвращать указатель.

1
22 августа 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by FlyMouse
Каких например? я вот думаю можно ли для этого создать вариантный массив из указателей? в С++ такие существуют?


Если на столько уж туго с С++, и в частности с шаблонами среди компонентов билдера есть целый ряд готовых контейнеров позволяющих работать с указателями. Единственное требование, то о чем сказал fellow предок должен быть общим, в данном случае - TObject.
Хотя ИМХО, стоило бы потратить время и разобратся с STL.

13K
22 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by honeybeer
Во-первых здрасте :D
Во-вторых, упаси вас Бог пользовать reinterpret_cast в приведениях типов, такого понаприводите - сами удивитесь. ИМХО, использовать его можно, но только в виде исключения.



Здрасте :)

Раз уж не нравится reinterpret_cast (хотя, тут, IMHO ему самое место, ибо этому шаблону ничего кроме заданного класса не подсунешь и ошибиться невозможно), тогда используйте static_cast или dynamic_cast, а объяснение принципов наследования, и RTTI товарищу FlyMouse я оставляю на вашей совести...

13K
22 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by Green
Пять баллов!
"Что такое юг мы не знаем, но до неприятностей вы уже долетели..." :)


Ну std::string не шаблон, а вот std::basic_string - шаблон.
Зачем? Ты что-нибудь слышал про wide character ?
Думаю тебе следует подумать на досуге зачем вообще существуют шаблоны.


А причем тут Qt? Я понимаю, еслиб ты ещё с boost-ом сравнивал... но Qt... это совсем из другой оперы.


Учитесь писать на С++, а не жалком С-подобном уродце.


А сумеешь? Тогда вперед, послушаем.



Не хуже Вас на C++ пишу, работаю в НИИ "Автоматической аппаратуры" программистом, и пока считаюсь одним из лучших сотрудников. Учусь в МИРЭА на 3 курсе на программиста, и пока по специальности имею только 5 и чаще всего автоматом. Тем более, что программированием занимаюсь уже около 10 лет - это мое хобби, и в общем-то свое свободное время трачу на него. За все это время я уже успел изучить Basic (с него начинал), Pascal, C/C++ и Assembler. И уж советую Вам не сомневаться в моей компетентности. Если сомневаетесь - можете устроить допрос с пристрастием :)

А что касается любви или нелюбви к STL - это имхо вопрос вкуса. Qt сделана намного красивее и удобнее. Что такое wide char, и Unicode в частности, я знаю очень хорошо. И поэтому люблю Qt. Там прекрасный набор классов, в том числе и списков, а строка (QString), которая хранит внутри себя юникод и при необходимости перекодирует внутреннее содержимое в локальную кодировку ОС, имхо гораздо удобнее, чем постоянные думы, о том, нужен мне basic_string<wchar_t> или basic_string<char> и что во что кодировать. Да и к тому же в Qt реализован прекрасный механизм copy-on-write. Не зря они за коммерческую версию 3 штукаря баксов хотят. Прекрасная GUI- библиотека с набором дополнительных полезных классов, если мне не изменяет память то CLX (аналог VCL в Kylix) построен именно на ней.

А то что Qt тут не причем - не спорю. Мы же про VCL говорим :)

13K
22 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by fellow
Ой! "Чисто субъективно" - мощный аргумент :)

Вот что получается: stl, видите ли, не нравится, но предложенное тобой решение - всё равно шаблон! Так не проще ли вместо всего, нагороженного тобой в "template <class T> class MyList" и далее, написать коротко и понятно: vector<TMemo*> Memoes и получить желаемое и причём без всяких reinterpret_cast?

Или уж предложил бы чисто Qt-шное решение, без TList :)



А оптимизатор компилятора все шаблоновские функции всё-равно inline'ом сделает, так что никакой потери производительности.

А Qt-шное решение я бы с радостью предложил, но Qt + VCL... Не думаю, что стоит делать из программы монстра

310
23 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Nikolay86
А оптимизатор компилятора все шаблоновские функции всё-равно inline'ом сделает, так что никакой потери производительности.


Так чем же хуже стандартный вектор Вашего template <class T> class MyList? Зачем повторно изобретать колесо? Только лишь для того, чтобы продемонстрировать свой широчайший кругозор?

Спуститесь с необъятных эмпиреев собственной гениальности, даруйте мне, тупорылому, счастье познания! Где уж мне, скорбному умом, меряться пиписькой со светочем МИРЭА и целого НИИ!

310
23 августа 2005 года
fellow
853 / / 17.03.2003
FlyMouse, какие у тебя познания в С++ вообще? Судя по некоторым вопросам, налицо явное недопонимание между тобой и теми, кто реально пытается тебе помочь.

Скажи простыми словами, чего ты хочешь сделать получить, без примеров кода. Что за систему ты ваяешь? Это первая твоя система? Все предыдущие написаны на С++ с применением его специфических особенностей (наследственность, полиморфизм, строгая типизация, параметризованные классы и проч.)? Или ты Архангельского начитался и принялся кнопки нажимать? :)
13K
23 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by fellow
Так чем же хуже стандартный вектор Вашего template <class T> class MyList? Зачем повторно изобретать колесо? Только лишь для того, чтобы продемонстрировать свой широчайший кругозор?

Спуститесь с необъятных эмпиреев собственной гениальности, даруйте мне, тупорылому, счастье познания! Где уж мне, скорбному умом, меряться пиписькой со светочем МИРЭА и целого НИИ!



Я помоему уже неоднократно писал, что это решение не является оптимальным и красивым, однако это не тот случай, когда использование неоптимального решения приведет к потере производительности. Я же не предлагаю сортировать массив из 3 млн. элементов методом пузырька :) А написано оно лишь потому, что IMHO будет более понятным FlyMouse.

А на "необъятные эмпиреи собственной гениальности" я не поднимался, просто не люблю, когда на меня наезжают.

13K
23 августа 2005 года
Nikolay86
8 / / 21.08.2005
Цитата:
Originally posted by fellow
FlyMouse, какие у тебя познания в С++ вообще? Судя по некоторым вопросам, налицо явное недопонимание между тобой и теми, кто реально пытается тебе помочь.

Скажи простыми словами, чего ты хочешь сделать получить, без примеров кода. Что за систему ты ваяешь? Это первая твоя система? Все предыдущие написаны на С++ с применением его специфических особенностей (наследственность, полиморфизм, строгая типизация, параметризованные классы и проч.)? Или ты Архангельского начитался и принялся кнопки нажимать? :)



Позволю себе ответить за него. Пусть он меня поправит, если что.

Он ваяет IRC клиент и ему нужен был TList открытых окон чата. VCL он терпеть не может, но, поскольку не знаком с WinAPI, "вынужден" им пользоваться.

А ситуация с C++ у него примерно из области последнего высказывания. Поэтому страшные слова std::vector очень пугают бедного мальчика :) А когда написано куча знакомых слов и только одно незнакомое (template) ему не так страшно :)

310
23 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Nikolay86
[COLOR=crimson]<<много-много всяких благоглупостей, выпущенных мною (fellow)>>[/COLOR]



М-да ужжж. Ну, сказать "инфантилизм" - так ведь обижаться начнут. Не буду ничего говорить.

11K
24 августа 2005 года
FlyMouse
12 / / 13.08.2005
fellow
А в чем проблема, вы тут программированием занимаетесь или составлением биографии ...?:devil:

Originally posted by fellow
FlyMouse, какие у тебя познания в С++ вообще? Судя по некоторым вопросам, налицо явное недопонимание между тобой и теми, кто реально пытается тебе помочь.

Пускай тебя это не смущает. Если я чего то не знаю я задаю вопросы и получаю ответы так или иначе, т.к. только понимая что ты не знаешь ты можешь это изучать. ;)

Скажи простыми словами, чего ты хочешь сделать получить, без примеров кода. Что за систему ты ваяешь? Это первая твоя система? Все предыдущие написаны на С++ с применением его специфических особенностей (наследственность, полиморфизм, строгая типизация, параметризованные классы и проч.)? Или ты Архангельского начитался и принялся кнопки нажимать? :)

Архангельского в том числе, денег на книги нет, буду рад если скините что нибудь полезное, т.к. реально изучать программирование(С++) начал где то месяц назад. До этого полгода "программировал" на Делфях. Сделал небольшую прогу вывода графики на GDI для движка игры.
11K
24 августа 2005 года
FlyMouse
12 / / 13.08.2005
Originally posted by fellow
Так чем же хуже стандартный вектор Вашего template <class T> class MyList? Зачем повторно изобретать колесо? Только лишь для того, чтобы продемонстрировать свой широчайший кругозор?

продемонстрировать свой широчайший кругозор мы просим вас, вот и напишите пожалуйста как это применять ...

Спасибо за что сказали про вектора, обязательно посмотрю как это работает, а сам я с ними не знаком.
310
24 августа 2005 года
fellow
853 / / 17.03.2003
Являясь по натуре существом спокойным, добродушным и даже вполне человеколюбивым, всегда рад помочь ближнему своему.
Но! при одном условии.

Я ожидаю от ближнего хоть капельку усилий по преодолению собственного инфантилизма. Какого, спрашивается, лешего юная особа, не озаботившись ни поиском, ни приобретением литературы, начинает вставать в позицию номер пять и качать права "покажите мне, дайте мне, научите меня"! Да ещё и обижается бесконечно, когда укажешь на её инфантилизм.

Всякий ошибается, всякий чего-нибудь да не знает. Но зрелый (не по годам, по характеру) человек будет искать способы преодоления своего незнания, а не попрошайничать информацию, сидя перед компьютером с доступом в Инет.

Имеющий уши да услышит, ищущий да обрящет - сказано в Библии. И если слова классической книги не доходят, могу повторить на новоязе: поиск рулезззз фарева.

Боюсь только, зря я тут бисер мечу.

Возвращаясь к FlyMouse и его проблемам.
Цитата:
Originally posted by FlyMouse
[COLOR=orangered]<<много-много всяких благоглупостей, выпущенных мною (fellow)>>[/COLOR]



Справка. Поиск. Книжный магазин. "Правильный вопрос содержит в себе половину ответа". http://www.linuxrsp.ru/artic/smart-questions-ru.html Владимир Ульянов-Ленин во многих вопросах заблуждался, но по крайней мере в одном он был прав: "Учиться, учиться, и ещё раз учиться" :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог