Преобразование типов
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;};
Какие существуют способы преобразования из указателя в составной тип? И возможно ли сделать функцию которая принмала указатель и возвращала объект:
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;};
Я не понел? тебе нужно получить из указателя объект на который он указывает? Так поставь перед указателем звездочку и все.
преобразование в нужный тип, напр. указатель на объект Profile:
(Profile *)v;
Я не понел? тебе нужно получить из указателя объект на который он указывает? Так поставь перед указателем звездочку и все.
Profile::GetObject(int i)
{
TObject *O = (TObject *)ObjectList[0][Count];
return = O;//получается так?
};
Profile::GetObject(int i)
{
TObject *O = (TObject *)ObjectList[0][Count];
return = O; //получается так?
};
Во-первых не
а
т.е. тебе дается указатель на объект, его нужно разадресовать.
Во-вторых что за двойная адресация у TList? Сами объекты получаются через свойство Items.
В-третих зачем тебе вообще нужно возвращать объект, возвращай указатель на него и работай с ним.
Ясно, что такой контейнер можно реализовать уймой способов.
FlyMouse избрал нормальный со всех точек зрения путь - контейнер указателей на объекты.
Остаётся только уточнить: объекты, хранимые в контейнере, производные от одного какого-то базового типа или они не имеют общего предка в цепи наследования?
Из первоначального вопроса FlyMouse я понял, что на самом деле его цель - не приведения типов как таковые, а создание полиморфного контейнера.
Ясно, что такой контейнер можно реализовать уймой способов.
Да, похоже.
FlyMouse избрал нормальный со всех точек зрения путь - контейнер указателей на объекты.
Но в примере фигурирует void*, что ОЧЕНЬ плохо!
Не используйте void*!!!
Остаётся только уточнить: объекты, хранимые в контейнере, производные от одного какого-то базового типа или они не имеют общего предка в цепи наследования?
Теоретически не может быть неродственных объектов хранимых в одном контейнере. В противном случае - это ошибка проектирования.
Положите мне в коробку немного апельсинов, немного синего цвета, немного звуков "ля" и запаха жасмина... :)
Да, похоже.
Но в примере фигурирует void*, что ОЧЕНЬ плохо!
Не используйте void*!!!
Теоретически не может быть неродственных объектов хранимых в одном контейнере. В противном случае - это ошибка проектирования.
Положите мне в коробку немного апельсинов, немного синего цвета, немного звуков "ля" и запаха жасмина... :)
Ну вот, весь кайф мне обломал :D
Я как раз собирался в развитии темы FlyMouse'а носом наторкать в void* и в бардак в "коробке" :D :P ;)
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]; // Получение объекта
Тернистый путь м-ра Самоделкина aka Nikolay86....
А что? Стандартный vector пользовать не судьба?
М-да ужж.....
Тернистый путь м-ра Самоделкина aka Nikolay86....
А что? Стандартный vector пользовать не судьба?
Ну, во-первых, у нас с STL взаимное неприятие. :)
А во-вторых, я FlyMouse знаю почти лично, и он с vector тоже не дружит...
Ну, во-первых, у нас с STL взаимное неприятие. :)
А во-вторых, я FlyMouse знаю почти лично, и он с vector тоже не дружит...
А что так?
А что так?
Ну, если это вопрос про мое неприятие STL, тогда скажу. Я особо STL не изучал, т.к. она мне не понравилась чисто субъективно с первого взгляда :)
Особенно бесит std::string. Ну вот зачем было её шаблоном делать, я лично не понимаю... Мне по нраву больше библиотека Qt. IMHO, гораздо удобнее и функциональнее.
А что касается вопроса FlyMouse, то ему просто нужен TList объектов, но ему не хочется каждый раз писать reinterpret_cast.
Шаблон получился обычной оберткой вокруг TList, наверное лучше было бы сделать вообще макрос взамен перегруженного оператора [], но тогда товарищу FlyMouse пришлось бы объяснять, что такое макросы :) А я с рождения жутко ленивый...
Хотя, теперь наверное придется объяснять, что такое шаблоны :)
Вот что получается: stl, видите ли, не нравится, но предложенное тобой решение - всё равно шаблон! Так не проще ли вместо всего, нагороженного тобой в "template <class T> class MyList" и далее, написать коротко и понятно: vector<TMemo*> Memoes и получить желаемое и причём без всяких reinterpret_cast?
Или уж предложил бы чисто Qt-шное решение, без TList :)
Я особо STL не изучал, т.к. она мне не понравилась чисто субъективно с первого взгляда :)
Пять баллов!
"Что такое юг мы не знаем, но до неприятностей вы уже долетели..." :)
Особенно бесит std::string. Ну вот зачем было её шаблоном делать, я лично не понимаю...
Ну std::string не шаблон, а вот std::basic_string - шаблон.
Зачем? Ты что-нибудь слышал про wide character ?
Думаю тебе следует подумать на досуге зачем вообще существуют шаблоны.
Мне по нраву больше библиотека Qt. IMHO, гораздо удобнее и функциональнее.
А причем тут Qt? Я понимаю, еслиб ты ещё с boost-ом сравнивал... но Qt... это совсем из другой оперы.
наверное лучше было бы сделать вообще макрос взамен перегруженного оператора []
Учитесь писать на С++, а не жалком С-подобном уродце.
Хотя, теперь наверное придется объяснять, что такое шаблоны :)
А сумеешь? Тогда вперед, послушаем.
Во-первых не
a TObject O = *((TObject *)ObjectList[0][Count]);
т.е. тебе дается указатель на объект, его нужно разадресовать.
{
//TMyMemo * M = (TMyMemo *)ServerList->Items[count];так нормально работает
TMyMemo M = *((TMyMemo *)ServerList[0][count]);//E2034 Cannot convert 'TMyMemo' to 'TMyMemo *'
return M;
}
Во-вторых что за двойная адресация у TList? Сами объекты получаются через свойство Items.
[] - обращение к TList как к указателю, []-перегруженная оперция для доступа к списку
В-третих зачем тебе вообще нужно возвращать объект, возвращай указатель на него и работай с ним.
Писано "на коленке", поэтому могут быть очепятки и/или недоработки
P.AddObject(new TMemo);
Пишет вот такую лабуду Could not find a match for 'TMemo::TMemo()'
Как теперь добавить метод для создания объекта из другого класса?
{
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;
}
Из первоначального вопроса FlyMouse я понял, что на самом деле его цель - не приведения типов как таковые, а создание полиморфного контейнера.
Ясно, что такой контейнер можно реализовать уймой способов.
Каких например? я вот думаю можно ли для этого создать вариантный массив из указателей? в С++ такие существуют?
Каких например? я вот думаю можно ли для этого создать вариантный массив из указателей? в С++ такие существуют?
Я же сказал - используй vector.
Определись, объекты какого типа ты собираешься хранить в контейнере. Только, заклинаю, не пихай в контейнер объекты разных типов, не имеющих общего предка в цепочке наследования.
Если ты собираешься хранить объекты из библиотеки VCL, то сделай vector<TObject*>, или vector<TComponent*>, или vector<TControl*>.
В первом случае ты сможешь работать со всеми хранящимися в контейнере объектами как с TObject. Во втором случае - как с TComponent. А в третьем - как с TControl.
Ясно, что всякие явные приведения типов нежелательны, поскольку программирование на С++ в таких приведениях не нуждается.
Подробности в справке, а так же в толковых и грамотных (хотя и не настолько тривиальных) книгах Страуструпа и других умных авторов. [COLOR=tomato]Ни в коем случае не Архангельский!!![/COLOR] :D
Во-вторых, упаси вас Бог пользовать reinterpret_cast в приведениях типов, такого понаприводите - сами удивитесь. ИМХО, использовать его можно, но только в виде исключения.
2 terran
как вы считаете, а не VCL объект ли этот TObject?
Во-первых здрасте :D
Во-вторых, упаси вас Бог пользовать reinterpret_cast в приведениях типов, такого понаприводите - сами удивитесь. ИМХО, использовать его можно, но только в виде исключения.
2 terran
как вы считаете, а не VCL объект ли этот TObject?
Ага, извиняюсь, ошибся. Как я уже и говорил выше надо возвращать указатель.
Каких например? я вот думаю можно ли для этого создать вариантный массив из указателей? в С++ такие существуют?
Если на столько уж туго с С++, и в частности с шаблонами среди компонентов билдера есть целый ряд готовых контейнеров позволяющих работать с указателями. Единственное требование, то о чем сказал fellow предок должен быть общим, в данном случае - TObject.
Хотя ИМХО, стоило бы потратить время и разобратся с STL.
Во-первых здрасте :D
Во-вторых, упаси вас Бог пользовать reinterpret_cast в приведениях типов, такого понаприводите - сами удивитесь. ИМХО, использовать его можно, но только в виде исключения.
Здрасте :)
Раз уж не нравится reinterpret_cast (хотя, тут, IMHO ему самое место, ибо этому шаблону ничего кроме заданного класса не подсунешь и ошибиться невозможно), тогда используйте static_cast или dynamic_cast, а объяснение принципов наследования, и RTTI товарищу FlyMouse я оставляю на вашей совести...
Пять баллов!
"Что такое юг мы не знаем, но до неприятностей вы уже долетели..." :)
Ну 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 говорим :)
Ой! "Чисто субъективно" - мощный аргумент :)
Вот что получается: stl, видите ли, не нравится, но предложенное тобой решение - всё равно шаблон! Так не проще ли вместо всего, нагороженного тобой в "template <class T> class MyList" и далее, написать коротко и понятно: vector<TMemo*> Memoes и получить желаемое и причём без всяких reinterpret_cast?
Или уж предложил бы чисто Qt-шное решение, без TList :)
А оптимизатор компилятора все шаблоновские функции всё-равно inline'ом сделает, так что никакой потери производительности.
А Qt-шное решение я бы с радостью предложил, но Qt + VCL... Не думаю, что стоит делать из программы монстра
А оптимизатор компилятора все шаблоновские функции всё-равно inline'ом сделает, так что никакой потери производительности.
Так чем же хуже стандартный вектор Вашего template <class T> class MyList? Зачем повторно изобретать колесо? Только лишь для того, чтобы продемонстрировать свой широчайший кругозор?
Спуститесь с необъятных эмпиреев собственной гениальности, даруйте мне, тупорылому, счастье познания! Где уж мне, скорбному умом, меряться пиписькой со светочем МИРЭА и целого НИИ!
Скажи простыми словами, чего ты хочешь сделать получить, без примеров кода. Что за систему ты ваяешь? Это первая твоя система? Все предыдущие написаны на С++ с применением его специфических особенностей (наследственность, полиморфизм, строгая типизация, параметризованные классы и проч.)? Или ты Архангельского начитался и принялся кнопки нажимать? :)
Так чем же хуже стандартный вектор Вашего template <class T> class MyList? Зачем повторно изобретать колесо? Только лишь для того, чтобы продемонстрировать свой широчайший кругозор?
Спуститесь с необъятных эмпиреев собственной гениальности, даруйте мне, тупорылому, счастье познания! Где уж мне, скорбному умом, меряться пиписькой со светочем МИРЭА и целого НИИ!
Я помоему уже неоднократно писал, что это решение не является оптимальным и красивым, однако это не тот случай, когда использование неоптимального решения приведет к потере производительности. Я же не предлагаю сортировать массив из 3 млн. элементов методом пузырька :) А написано оно лишь потому, что IMHO будет более понятным FlyMouse.
А на "необъятные эмпиреи собственной гениальности" я не поднимался, просто не люблю, когда на меня наезжают.
FlyMouse, какие у тебя познания в С++ вообще? Судя по некоторым вопросам, налицо явное недопонимание между тобой и теми, кто реально пытается тебе помочь.
Скажи простыми словами, чего ты хочешь сделать получить, без примеров кода. Что за систему ты ваяешь? Это первая твоя система? Все предыдущие написаны на С++ с применением его специфических особенностей (наследственность, полиморфизм, строгая типизация, параметризованные классы и проч.)? Или ты Архангельского начитался и принялся кнопки нажимать? :)
Позволю себе ответить за него. Пусть он меня поправит, если что.
Он ваяет IRC клиент и ему нужен был TList открытых окон чата. VCL он терпеть не может, но, поскольку не знаком с WinAPI, "вынужден" им пользоваться.
А ситуация с C++ у него примерно из области последнего высказывания. Поэтому страшные слова std::vector очень пугают бедного мальчика :) А когда написано куча знакомых слов и только одно незнакомое (template) ему не так страшно :)
[COLOR=crimson]<<много-много всяких благоглупостей, выпущенных мною (fellow)>>[/COLOR]
М-да ужжж. Ну, сказать "инфантилизм" - так ведь обижаться начнут. Не буду ничего говорить.
А в чем проблема, вы тут программированием занимаетесь или составлением биографии ...?:devil:
Originally posted by fellow
FlyMouse, какие у тебя познания в С++ вообще? Судя по некоторым вопросам, налицо явное недопонимание между тобой и теми, кто реально пытается тебе помочь.
Пускай тебя это не смущает. Если я чего то не знаю я задаю вопросы и получаю ответы так или иначе, т.к. только понимая что ты не знаешь ты можешь это изучать. ;)
Скажи простыми словами, чего ты хочешь сделать получить, без примеров кода. Что за систему ты ваяешь? Это первая твоя система? Все предыдущие написаны на С++ с применением его специфических особенностей (наследственность, полиморфизм, строгая типизация, параметризованные классы и проч.)? Или ты Архангельского начитался и принялся кнопки нажимать? :)
Архангельского в том числе, денег на книги нет, буду рад если скините что нибудь полезное, т.к. реально изучать программирование(С++) начал где то месяц назад. До этого полгода "программировал" на Делфях. Сделал небольшую прогу вывода графики на GDI для движка игры.
Так чем же хуже стандартный вектор Вашего template <class T> class MyList? Зачем повторно изобретать колесо? Только лишь для того, чтобы продемонстрировать свой широчайший кругозор?
продемонстрировать свой широчайший кругозор мы просим вас, вот и напишите пожалуйста как это применять ...
Спасибо за что сказали про вектора, обязательно посмотрю как это работает, а сам я с ними не знаком.
Но! при одном условии.
Я ожидаю от ближнего хоть капельку усилий по преодолению собственного инфантилизма. Какого, спрашивается, лешего юная особа, не озаботившись ни поиском, ни приобретением литературы, начинает вставать в позицию номер пять и качать права "покажите мне, дайте мне, научите меня"! Да ещё и обижается бесконечно, когда укажешь на её инфантилизм.
Всякий ошибается, всякий чего-нибудь да не знает. Но зрелый (не по годам, по характеру) человек будет искать способы преодоления своего незнания, а не попрошайничать информацию, сидя перед компьютером с доступом в Инет.
Имеющий уши да услышит, ищущий да обрящет - сказано в Библии. И если слова классической книги не доходят, могу повторить на новоязе: поиск рулезззз фарева.
Боюсь только, зря я тут бисер мечу.
Возвращаясь к FlyMouse и его проблемам.
[COLOR=orangered]<<много-много всяких благоглупостей, выпущенных мною (fellow)>>[/COLOR]
Справка. Поиск. Книжный магазин. "Правильный вопрос содержит в себе половину ответа". http://www.linuxrsp.ru/artic/smart-questions-ru.html Владимир Ульянов-Ленин во многих вопросах заблуждался, но по крайней мере в одном он был прав: "Учиться, учиться, и ещё раз учиться" :)