|
Вопрос по С++ |
|
|
|
Dec 13 2011, 18:49
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(neiver @ Dec 13 2011, 20:38)  Если есть возможность использовать динамическую память , то вообще без проблем. Не использовал пока динамическую память, нода смотреть как с этим в IAR AVR. Цитата(neiver @ Dec 13 2011, 20:38)  статический буфер достаточного размера, чтоб вместить самого большого наследника и placement new Получается по смыслу что-то аналогичное Сишному union-у?
|
|
|
|
|
Dec 13 2011, 19:12
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Цитата(_Артём_ @ Dec 13 2011, 22:49)  Получается по смыслу что-то аналогичное Сишному union-у? Нет. Просто статически выделяется буфер в памяти и в нем конструируется (с помощью конструктора) объект нужного типа. Код char buffer[MAX_BUFFER_SIZE]; // static array ... class Base{...}; class D1 :public Base {...}; class D2 :public Base {...}; class D3 :public Base {...}; ...
Base *ProduceObject(ObjectType type) { switch(type) { case Type1: return new (buffer) D1(); // creating an object using palcement new case Type2: return new (buffer) D2(); case Type3: return new (buffer) D3(); } } Да, еще возможно придётся определить оператор new если он еще не определен: Код void *operator new(unsigned int size, void* ptr) { return ptr; } В этом операторе можно что-то сделать с буфером памяти, обнулить его, например, а можно ничего не делать.
Сообщение отредактировал neiver - Dec 13 2011, 19:38
|
|
|
|
|
Dec 13 2011, 20:07
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(neiver @ Dec 13 2011, 21:12)  Нет. Просто статически выделяется буфер в памяти и в нем конструируется (с помощью конструктора) объект нужного типа. Код char buffer[MAX_BUFFER_SIZE]; // static array ... class Base{...}; class D1 :public Base {...}; class D2 :public Base {...}; class D3 :public Base {...}; ...
Base *ProduceObject(ObjectType type) { switch(type) { case Type1: return new (buffer) D1(); // creating an object using palcement new case Type2: return new (buffer) D2(); case Type3: return new (buffer) D3(); } } Да, еще возможно придётся определить оператор new если он еще не определен: Код void *operator new(unsigned int size, void* ptr) { return ptr; } В этом операторе можно что-то сделать с буфером памяти, обнулить его, например, а можно ничего не делать. Что-то всё равно не так. Ввёл: Код char buffer[1000]; // static array
class Base { public: unsigned int A; unsigned int N; void SetA(unsigned int a) { A=a; } }; class D1 :public Base { public: void *operator new(unsigned int size, void* ptr) { } void SetN() { N=0; } }; class D2 :public Base { public: void SetN() { N=1; } }; class D3 :public Base { public: void SetN() { N=2; } };
Base *ProduceObject(unsigned char type) { switch(type) { case 0: return new (buffer) D1(); // creating an object using palcement new case 1: return new (buffer) D2(); case 2: return new (buffer) D3(); } } int _tmain(int argc, _TCHAR* argv[]) {
Base *p; p=ProduceObject(0); p->SetA(10); } Компилятор говорит: Цитата error C2660: 'operator new' : function does not take 2 arguments
|
|
|
|
|
Dec 13 2011, 21:37
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Сергей Борщ @ Dec 13 2011, 23:06)  Так вы operator new объявили членом D2, а надо его сделать членом Base. Да, не заметил. Спасибо. Цитата(Сергей Борщ @ Dec 13 2011, 23:06)  А еще можно buffer и фабрику также спрятать внутрь base, сделав статическим членом и статической функцией соответственно. Попробую. Проверял в Visual Studio (ничего другого под рукой нет). Как считаете в IAR AVR так же всё будет работать?
|
|
|
|
|
Dec 14 2011, 08:33
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(_Артём_ @ Dec 13 2011, 20:38)  Создать класс содержащий все нужные функции (различающиеся команды объявить как виртуальные), от него создать нужное количество наследников с переопределёнными функциями и . ...... ИМХО, тут можно конечно сделать, но из за 2-x, 3-x подобных устройств использовать С++ со своими возможностями ООП (виртуальные функции и полиморфизм) Вам больше навредит, чем поможет. Сильно не рационально. С++ надо использовать только там, где это действительно необходимо и приемлемо, а не просто ради того чтоб использовать. Вот если бы подобных устройств было десятки, еще можно говорить….
--------------------
Magic Friend
|
|
|
|
|
Dec 14 2011, 08:51
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Цитата(Danis @ Dec 14 2011, 12:33)  ИМХО, тут можно конечно сделать, но из за 2-x, 3-x подобных устройств использовать С++ со своими возможностями ООП (вирртуальные функции и полиморфизм) вам больше навредит, чем поможет. Сильно не рационально. С++ надо использовать только там, где это действительно необходимо и рационально, а не просто ради того чтоб использовать. Вот если бы подобных устройств было десятки, еще можно говорить…. Поставленную задачу и проще и эффективнее решать именно с помощью виртуальных функций и полиморфизма и не важно сколько конкретно устройств имеется, их может быть более одного - этого уже достаточно. К тому-же как это можно реализовать без полиморфизма? С помощью таблиц функций? Вручную их заполнять нужными значениями и т.д. Получаются те-же виртуальные функции, только самописные и кривые - восход солнца вручную. Вставлять в местах где поведение устройств ветвления по типу устройства? Еще более неудобно и черевато дополнительными ошибками. Так, что выбранный путь очень даже рационален. Виртуальные функции дешевы и удобны.
|
|
|
|
|
Dec 14 2011, 09:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Danis @ Dec 14 2011, 10:33)  ИМХО, тут можно конечно сделать, но из за 2-x, 3-x подобных устройств использовать С++ со своими возможностями ООП (виртуальные функции и полиморфизм) Вам больше навредит, чем поможет. Сильно не рационально. С++ надо использовать только там, где это действительно необходимо и приемлемо, а не просто ради того чтоб использовать. Вот если бы подобных устройств было десятки, еще можно говорить…. В смысле? Что значит "десятки устройств"? Десятки типов устройств? Или экземпляров? Типов модулей может быть 2-3-..5..10(это точно перебор, да и 5 - перебор: 2-3, а дальше - много(слишком)) А модулей - сотни(чем больше тем лучше) каждого типа... У как по-Вашему лучше сделать? Цитата(Danis @ Dec 14 2011, 10:33)  С++ надо использовать только там, где это действительно необходимо и приемлемо, а не просто ради того чтоб использовать честный ответ - как глоток свежего воздуха...© А где ж его использовать?(С++, в смысле)...?
|
|
|
|
|
Dec 16 2011, 08:23
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(dxp @ Dec 14 2011, 15:59)  ...какие именно аспекты С++ делают его нерекомендуемым для использования с МК? для этого надо сначала понять, какие плюсы Вы видите в его использовании? только без взгляда под углом, что это можно сделать. Сделать можно ВСЁ... а вот плюсы...с этим уже поконкретней. (круглый) ЗЫ Всегда надо идти от задачи. Лично мне не известны такие задачи где требуется си плас плас под МК. За исключением не анжинерных задач - типа попилить бабло. Но это мы не бум рассматривать надеюсь...
|
|
|
|
|
Dec 16 2011, 09:28
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(_Артём_ @ Dec 14 2011, 12:35)  В смысле? Что значит "десятки устройств"? Десятки типов устройств? Или экземпляров? Разумеется типов, Вы же сами писали: "два-три близких по системе команд GSM-модема". Цитата(_Артём_ @ Dec 14 2011, 12:35)  У как по-Вашему лучше сделать? На чистом Си, нет никаких проблем. Не хочу переводить тему в категорию Си vs C++. Сам пишу софт в основном для ПК, на С++. В микроконтроллере мне С++ понадобился 1 раз, кода писал приложение для TFT панели, писал свой GUI. Тут С++ со своими возможностями ООП ”рулит”.
--------------------
Magic Friend
|
|
|
|
|
Dec 16 2011, 09:57
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(kolobok0 @ Dec 16 2011, 10:23)  Лично мне не известны такие задачи где требуется си плас плас под МК. Лично мне не известны такие задачи, где требуется что угодно, кроме текстового редактора (набирать вручную HEX-файлы). Этого, в принципе, достаточно. Мнемокод — уже счастье. Ассемблер, да если еще и с макросами — рай земной. (« нужно человеку буханка хлеба и четверть ведра воды в день, всего остального ему хочется» © забыл чей)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|