|
|
  |
Снова про const, не получается переползти с С на СРР |
|
|
|
Jan 11 2011, 18:52
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Aprox @ Jan 12 2011, 00:04)  как в Embedded С++ сделать так, чтобы свойства-константы оказались в ROM, а конструктор TComboBox выглядел бы прилично? Ну вы всё правильно делаете - константные структуры, и указатель на них в качестве параметра конструктора. Если объектов немного, то можно шаблонами. Типа Код struct ComboProps1 { enum { width = 200 }; enum { height = 500 }; enum { some_bool_prop1 = false }; ... };
struct ComboProps2 { enum { width = 300 }; enum { height = 200 }; enum { some_bool_prop1 = true }; ... };
template<typename Props> class TComboBox { enum { width = Props::width }; ... }
TComboBox<ComboProps1> Combo1; TComboBox<ComboProps2> Combo2;
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 12 2011, 05:12
|

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

|
Цитата(Oldring @ Jan 11 2011, 18:25)  В голых сях - иначе. Было у Страуструпа эссе по этому поводу. Слово гарантирует, что программист не модифицирует объект неумышленно. Но всё равно если есть конструктор-деструктор, они будут вызваны. Ни конструктор, ни деструктор не изменяют константных членов-данных. Только создают или удаляют. То, что это не очень вяжется с концепциями реализации ПЗУ - так ПЗУ и константы - это разные вещи. В конструкторе допускается инициализация константных полей, но только в списке инициализации, в теле конструктора уже нет. И работает это только для целых (почему такое ограничение, не знаю). Т.ч. ничего там не меняется. Цитата(Oldring @ Jan 11 2011, 18:25)  И иногда константные объекты мутируют. Было даже введено в язык специальное ключевое слово "mutable". Но иногда обходятся по-старинке и без него, снимая константность с указателя. mutable - это из другой песни. Это нужно, чтобы можно было отдельные поля модифицировать в фукнциях-членах, объявленных как const. Заметьте, что речь идет не о константных членах-данных. Такие данные изменить не получится в любом случае.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 12 2011, 17:23
|

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

|
const_cast<> цяця-ляля, но до тех пор, пока мы снимаем то, что оделось по дроге - метка (*1) ниже. А когда оно изначально было const -- метка (*2) -- имеем в полный рост UB, что как раз в embedded с флешами всякими и вылезет. На PC шара прокатывает. Пока не начали секции с константами селить в страницы "только для чтения" с исключениями "генерал Фаульта" при попытке записи. C++2003 7.1.5.1 The cv-qualifiers ... 4 Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior. 5 [Example: Код const int ci = 3; // cv-qualified (initialized as required) ci = 4; // ill-formed: attempt to modify const int i = 2; // not cv-qualified const int* cip; // pointer to const int cip = &i; // OK: cv-qualified access path to unqualified *cip = 4; // ill-formed: attempt to modify through ptr to const int* ip; // cast needed to convert const int* to int* ip = const_cast<int*>(cip); // defined: *ip points to i, a non-const object (*1) *ip = 4; const int* ciq = new const int (3); // initialized as required int* iq = const_cast<int*>(ciq); // cast required *iq = 4; // undefined: modifies a const object (*2)
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 13 2011, 02:47
|

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

|
Цитата(jorikdima @ Jan 12 2011, 18:34)  const_cast<>() ? После const_cast<> компилятор "умывает руки" и никакой защиты и проверок со его стороны стороны нет. Речь шла о безопасных преобразованиях (для чего умышленно вводят const в объявления) по правилам языка - так вот они не допускают модификации константных объектов. Цитата(Oldring @ Jan 12 2011, 14:29)  После явного снятия константности - легко. Ага. А еще метод: const int a = 10; int addr = (int)&a; int *p = (int*)addr; (*p)++; И еще много таких финтов можно придумать. Только речь о конструкциях языка, а не о хаках
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 13 2011, 06:05
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(AHTOXA @ Jan 12 2011, 00:52)  Ну вы всё правильно делаете - константные структуры, и указатель на них в качестве параметра конструктора. Ваш вариант задания констант-описаний выглядит читабельно и красиво. Однако, если в структуре-описания много разных типов, например, строки, указатели на места памяти, float и пр., то ваш вариант приводит к излишней писанине в момент декларации самих констант. Мне кажется, следующий вариант экономней в смысле писанины Код typedef struct{ int i; float f; char* s; } Tprops;
//----здесь декларации свойств с экономией писанины static const Tprops prop1 ={13, 3.14, "Name1"}; // это точно попадает в ROM static const Tprops prop2 ={16, 2.73, "Name2"}; // это точно попадает в ROM
class Tobj {//------------- const Tprops* p; public: Tobj(){} Tobj(const Tprops* prop) {p=prop;} // здесь можно пользоваться элементами описания *p.f или p->i };
Tobj example1=&prop1; Tobj example2=&prop2;
...
|
|
|
|
|
Jan 13 2011, 06:29
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Aprox @ Jan 13 2011, 14:05)  Мне кажется, следующий вариант экономней в смысле писанины Дык, моя фраза Цитата(AHTOXA @ Jan 12 2011, 02:52)  константные структуры, и указатель на них в качестве параметра конструктора. была как раз про этот вариант  А с шаблонами - это альтернативный.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 13 2011, 06:54
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(ReAl @ Jan 12 2011, 23:23)  А когда оно изначально было const -- метка (*2) -- имеем в полный рост UB, что как раз в embedded с флешами всякими и вылезет. Вы же не считаете, что запихивание констант во флеш - это defined bihavior? Всё, что обсуждается в этой теме, и есть UB. Цитата(Aprox @ Jan 13 2011, 12:05)  [code]typedef struct{ int i; float f; char* s; } Tprops; [code] Тут typedef в плюсах не нужен. Цитата(dxp @ Jan 13 2011, 08:47)  Только речь о конструкциях языка, а не о хаках И у вас "конструкции языка".
--------------------
Пишите в личку.
|
|
|
|
|
Jan 13 2011, 08:23
|

Местный
  
Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131

|
Цитата(AHTOXA @ Jan 13 2011, 12:29)  А с шаблонами - это альтернативный. Я про шаблоны и говорю, что писанины больше при инициализации полей структуры-описания. В каждом конкретном определении структуры свойств придется набирать имена полей и все сопутствующее. Кроме того, шаблоны не поддерживает Embedded C++, а переходить на Extended C++ сразу утяжеляет проект ненужными фичами. Я тут подумал, можно несколько повысить быстродействие, если передавать конструктору класса не указатель на структуру-описание, а ссылку на эту структуру. Заодно и в методах классах обращение к описаниям будет выглядеть приятнее.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|