|
|
  |
Как писать на С++ при создание приложений под ARM, Примеры |
|
|
|
Dec 10 2011, 07:29
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Массив указателей на объекты базового класса - это как раз правильное решение. А когда вы пытаетесь индексировать массив объектов производного класса Derived aaa[]={Derived(0),Derived(0),Derived(0)}; как массив объектов базового класса, то происходит "срезка". Объекты базового и производного класса имеют разные размеры. Цитата Derived *aaa[]={&Derived(0),&Derived(0),&Derived(0)}; а на такое компиллер матерится, типа юзание временного обьекта И правильно матерится. На стеке создаются три временных объекта, указатели на них заносятся в массив, после чего эти объекты уничтожаются и их место в стеке освобождается. В результате указатели в массиве указывают куда-то, где раньше был стек и ваши объекты. Сейчас там корректные данные, потом будет мусор. Правильно создать массив объектов производного типа и массив указателей базового типа...
|
|
|
|
|
Dec 10 2011, 15:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Цитата Для полноты картины, расскажите, для чего вам нужна такая конструкция? Что это на самом деле? Это для построения gui. вот пример использования: Код ....
static MenuItem* const settingsItemsList[]={ &settingsItems[0],&settingsItems[1], &settingsItems[2],&settingsItems[3], &settingsItems[4],&settingsItems[5], &settingsItems[6],&settingsItems[7] }; static Menu settingsMenu(Rect(0,8,96,56),0,settingsItemsList,sizeof(settingsItemsList)/sizeof(MenuItem*));
static MenuItem mainItems[]={ MenuItem(0,"Normal",&normalMenu), MenuItem(0,"Professional",&proMenu), MenuItem(0,"Settings",&settingsMenu), }; static MenuItem* const mainItemsList[]={ &mainItems[0],&mainItems[1],&mainItems[2] }; static Menu mainMenu(Rect(0,8,96,56),0,mainItemsList,sizeof(mainItemsList)/sizeof(MenuItem*)); Сам конструкторы выглядят так: Код class Menu: public Widget{ public: Menu(const Rect &geom,Widget *parent=0,MenuItem* const *children=0,int nchild=0); ... Код class MenuItem: public Widget{ public: MenuItem(Menu *parent=0,const char *text=0,Menu *target=0); ... Код class Widget : public PaintDevice{ public: Widget(Widget *parent=0,Widget* const *children=0,int nchild=0); .... Цитата Массив указателей на объекты базового класса - это как раз правильное решение. правильное, только вот ни препроцессор, ни самя язык похоже не позволяет его создать "автоматом", в отличия, скажем, массива указателей на строки: const char* const stringptrs[]={"kolbasa1","kolbasa2","kolbasa3"}; вот такое хотелось бы иметь и для обьектов... Цитата Правильно создать массив объектов производного типа и массив указателей базового типа... массив указателей должен тоже быть производного типа, тк он передается производному классу сначала: Menu(const Rect &geom,Widget *parent=0, MenuItem* const *children=0,int nchild=0);
|
|
|
|
|
Dec 10 2011, 17:39
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(brag @ Dec 10 2011, 22:37)  массив указателей должен тоже быть производного типа, тк он передается производному классу сначала: Menu(const Rect &geom,Widget *parent=0,MenuItem* const *children=0,int nchild=0); Если я правильно понял, что требуется работа с коллекцией объектов, то я для таких целей юзаю stl::list<Widget*>. Да, там будет аллокация памяти, но размер ноды небольшой (три указателя) и траблов с фрагментацией в этом случае, вроде, не ожидается.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 10 2011, 18:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Цитата Если я правильно понял, что требуется работа с коллекцией объектов, то я для таких целей юзаю stl::list<Widget*>. Да, там будет аллокация памяти, но размер ноды небольшой (три указателя) и траблов с фрагментацией в этом случае, вроде, не ожидается. stl не канает, из доступных вещей есть только проц, голый компилятор и моск.
|
|
|
|
|
Dec 10 2011, 21:44
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(brag @ Dec 11 2011, 01:11)  stl не канает, из доступных вещей есть только проц, голый компилятор и моск. О как! А куда ж стандартная библиотека-то делась? Компилятор один, что-ли, присутствует?  К тому же, stl - открытая вещь, можно взять и отдельно. Правда, может потребоваться доводка напильником. А может и не потребоваться.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Dec 11 2011, 10:37
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(brag @ Dec 10 2011, 07:55)  Как можно реализовать такую вещ без кривоты, rtti, библиотек: Наверное как-то так: CODE template <typename T> class Base{ public: Base() : _a(NULL) {} Base(T *array) : _a(array) {} T *getItem(int n) const { return &_a[n]; } private: T * _a; };
class Derived: public Base<Derived>{ public: Derived() {} Derived(Derived *array) : Base<Derived>(array){} private: int other; };
int main() { Derived array[3]; Derived d(array); return printf("%p = %p\n", d.getItem(1), &array[1]); }
Хотя лучше, как Вам уже посоветовали, использовать stl. Цитата(brag @ Dec 11 2011, 03:59)  да просто проект такой, что проще свое написать, чем прикручивать что-то туда и потом парицца с синхронизацией, гонками итп... Если вы способны писать код классом выше чем годами и тысячами людей проверенные реализации stl, почему Вы задаете такие вопросы?  Если Вы используете многопоточность, неиспользование stl не гарантирует отсутствие в вашем коде гонок и не избавляет от необходимости "парицца с синхронизацией". Также как использование stl не способствует появлению гонок. Синхронизация потоков в обоих случаях остается вашей заботой.
Сообщение отредактировал alx2 - Dec 11 2011, 11:19
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Dec 11 2011, 13:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Спасибо. но это тоже не то, массив указателей все же должен быть, тк там могут быть наследники разных типов разного уровня и все они должны корректно обрабатываться базовым классом... Цитата Если вы способны писать код классом выше чем годами и тысячами людей проверенные реализации stl, почему Вы задаете такие вопросы? Никто этого не говорил, просто так проще, во первых. в системе совсем иные механизмы распределения памяти(скажем, аналога malloc нету) и других ресурсов, что несовместимо с stl, по крайней мере с ее частями.... на основе динамики (stl::list<Widget*>) не идет. И на основе статики тоже - памяти мало, надо экономить. Константый массив указателей в flash - самое оно, создавать бы его еще красиво...
|
|
|
|
|
Dec 12 2011, 10:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Цитата Если у вас и new нет реализации, то совсем всё плохо. new нету, дорого Цитата Не, не получается нифига. Думаю, что стоит getItem вытащить из базового класса - пускай он объект класса принимает на вход. не пойдет, по сколоьку нaдo иметь такую возможность: Код Derived1 derived1; Derived2 derived2; Base * const *arraay[]={&derived1,&derived2}; Derived3 d3(array);
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|