Здравствуйте, Vzhyk, Вы писали:
V>19.08.2011 23:41, kolobok55 пишет: >> >> Ну это и ежу понятно, а вот как нить через указатели и смещения? V>Зачем? Чтоб никто не догадался?
Здравствуйте, Vzhyk, Вы писали:
V>22.08.2011 12:42, okman пишет:
>> >> Не, ну может, человек обфускатор разрабатывает... V>Зачем?
Не "зачем", а "за что".
За деньги, конечно.
Обфусцированный код можно показать заказчику и даже дать скомпилировать, не боясь что его сопрут.
Можно писать секьюрити-продукт под GPL и обфусцировать исходные коды, "что б никто не догадался" —
концепция свободного ПО не будет нарушена ни в коей мере. Можно выкладывать в качестве примеров
здесь, на RSDN, типа вот, мол, как я оригинален.
Можно, конечно. Вместо трёх переменных заводится массив из трёх элементов. Вот Вам и функция-акцессор по номеру.
Если надо иметь имена a/b/c — ну, добавим именованных методов a()/b()/c(), которые просто дергают всё тот же акцессор, просто с соответствующим индексом.
Если будете использовать массив или какой-либо класс типа std::vector(если планируется добавлять/удалять элементы в рантайме), std::array (c++0x), то если используете оператор [] для доступа, то в начале функции вставляете обязательный assert(index < SIZE), где SIZE — размер вашего массива.
const size_t SIZE = 3;
class T
{
public:
int get(size_t index) const
{
assert(index < SIZE && "Invalid index.");
return m_elements[index];
}
private:
int m_elements[SIZE];
};
И еще можно исключение прикрутить . А вообще, все зависит от того, для каких задач будет использоваться этот класс. Будут ли добавляться/удаляться элементы в будущем, в ходе исполнения программы. В какое место они будут добавляться и удаляться. Какие значения может принимать индекс. Какие действия нужно предпринимать на конкретное значение индекса и тд...
Например, если значения индекса будут не по порядку, то можно думать об использовании std::map<int, int>, где первый int будет ключ, бывший index.
Неоконченная мысль всегда казалась Шри Япутре слишком
K>Ну это и ежу понятно, а вот как нить через указатели и смещения?
int x[3];
int* p = x + 3;
*p = 3;
это что ли?
Eсли указано выравнивание, то можно через указатель на this + смещение, но не рекомендую это делать, если вы не осознаете что делаете и как потом все это дело будет использоваться и поддерживаться!
struct T
{
int get(size_t index) const
{
int const* p = reinterpret_cast<int const*>(this) + index;
return *p;
}
void set(size_t index, int value)
{
int* p = reinterpret_cast<int*>(this) + index;
*p = value;
}
int x;
int y;
int z;
};
Неоконченная мысль всегда казалась Шри Япутре слишком