Доступ к переменным класса по номеру
От: kolobok55  
Дата: 19.08.11 15:17
Оценка:
Допустим есть класс

class T:
{
public:
 int GetByNum(int i);
private:
int a;
int b;
int c;
}




Можно ли как-то осуществить доступ к данным по номеру, т.е. написал

T t;
t.GetByNum(1);

мне вернули a;
Re: Доступ к переменным класса по номеру
От: Vzhyk  
Дата: 19.08.11 15:22
Оценка: 1 (1)
19.08.2011 18:17, kolobok55 пишет:
> t.GetByNum(1);
>
>
> мне вернули a;

int GetByNum(int i)
{
switch(i)
{
case 1: return a;
... и тюдю
}
}
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Доступ к переменным класса по номеру
От: kolobok55  
Дата: 19.08.11 20:41
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>19.08.2011 18:17, kolobok55 пишет:

>> t.GetByNum(1);
>>
>>
>> мне вернули a;

V>int GetByNum(int i)

V>{
V> switch(i)
V> {
V> case 1: return a;
V>... и тюдю
V> }
V>}

Ну это и ежу понятно, а вот как нить через указатели и смещения?
Re: Доступ к переменным класса по номеру
От: enji  
Дата: 19.08.11 21:01
Оценка:
Здравствуйте, kolobok55, Вы писали:

K>Допустим есть класс


K>
K>class T:
K>{
K>public:
K> int GetByNum(int i);
K>private:
K>int a;
K>int b;
K>int c;
K>}
K>




K>Можно ли как-то осуществить доступ к данным по номеру, т.е. написал


K>
K>T t;
K>t.GetByNum(1);
K>

K>мне вернули a;

А что будет если тип члена — не int?
И может быть проще сразу сложить это все в массив? А макросом нагенерить методов доступа?

Как-то так:

#define PROPERTY(n, no) int n() const { return data[no]; } void set_##n(int v) { data[no] = v; }

class T
{
  int data[2];
public:
  PROPERTY(a, 0)
  PROPERTY(b, 1)
  int GetByNum(int i) const { return data[i]; }
}
Re[3]: Доступ к переменным класса по номеру
От: Vzhyk  
Дата: 22.08.11 08:56
Оценка:
19.08.2011 23:41, kolobok55 пишет:
>
> Ну это и ежу понятно, а вот как нить через указатели и смещения?
Зачем? Чтоб никто не догадался?
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Доступ к переменным класса по номеру
От: okman Беларусь https://searchinform.ru/
Дата: 22.08.11 09:42
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>19.08.2011 23:41, kolobok55 пишет:

>>
>> Ну это и ежу понятно, а вот как нить через указатели и смещения?
V>Зачем? Чтоб никто не догадался?

Не, ну может, человек обфускатор разрабатывает...
Re: Доступ к переменным класса по номеру
От: morm Россия  
Дата: 22.08.11 10:08
Оценка: 2 (2)
Здравствуйте, kolobok55, Вы писали:

K>Допустим есть класс


K>
K>class T:
K>{
K>public:
K> int GetByNum(int i);
K>private:
K>int a;
K>int b;
K>int c;
K>}
K>




K>Можно ли как-то осуществить доступ к данным по номеру, т.е. написал


K>
K>T t;
K>t.GetByNum(1);
K>

K>мне вернули a;

А, например, boost::tuple не устроит?


typedef boost::tuple<std::string, bool, int, int, int > TABLE_COMMAND_PARAMS;

TABLE_COMMAND_PARAMS par(std::string("ЗАПАБ"), false, 4, 29, 10);

par.get<0> == "ЗАПАБ";
par.get<1> == false;


и т.д.
Re[5]: Доступ к переменным класса по номеру
От: Vzhyk  
Дата: 22.08.11 15:32
Оценка:
22.08.2011 12:42, okman пишет:

>

> Не, ну может, человек обфускатор разрабатывает...
Зачем?
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Доступ к переменным класса по номеру
От: okman Беларусь https://searchinform.ru/
Дата: 22.08.11 16:09
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>22.08.2011 12:42, okman пишет:


>>

>> Не, ну может, человек обфускатор разрабатывает...
V>Зачем?

Не "зачем", а "за что".
За деньги, конечно.

Обфусцированный код можно показать заказчику и даже дать скомпилировать, не боясь что его сопрут.
Можно писать секьюрити-продукт под GPL и обфусцировать исходные коды, "что б никто не догадался" —
концепция свободного ПО не будет нарушена ни в коей мере. Можно выкладывать в качестве примеров
здесь, на RSDN, типа вот, мол, как я оригинален.

P.S. Только не спрашивай зачем.
Re: Доступ к переменным класса по номеру
От: Mr.Delphist  
Дата: 25.08.11 09:44
Оценка:
Можно, конечно. Вместо трёх переменных заводится массив из трёх элементов. Вот Вам и функция-акцессор по номеру.
Если надо иметь имена a/b/c — ну, добавим именованных методов a()/b()/c(), которые просто дергают всё тот же акцессор, просто с соответствующим индексом.
Re: Доступ к переменным класса по номеру
От: Kolobrodin Россия  
Дата: 25.08.11 20:07
Оценка:
Здравствуйте, kolobok55, Вы писали:

Как вариант:

Если есть возможность использовать новый стандарт или boost, то std/boost::tuple.

class T
{
public:
    typedef std::tuple<int, double, char> elements;
  
    template <size_t N>
    struct element_type
    {
        typedef typename std::tuple_element<N, elements>::type type;
    };

public:
    template <size_t N>
    typename element_typet<N>::type get() const
    {
        return std::get<N>(m_elements);
    }

    template <size_t N>
    void set(typename element_type<N>::type value)
    {
        std::get<N>(m_elements) = value;
    }

private:
    elements m_elements;
};

T t;
t.get<1>();
t.set<1>(10);
Неоконченная мысль всегда казалась Шри Япутре слишком
Re: Доступ к переменным класса по номеру
От: Kolobrodin Россия  
Дата: 25.08.11 20:33
Оценка:
Здравствуйте, kolobok55, Вы писали:

Если будете использовать массив или какой-либо класс типа 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.
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[3]: Доступ к переменным класса по номеру
От: Kolobrodin Россия  
Дата: 25.08.11 20:46
Оценка:
Здравствуйте, kolobok55, Вы писали:


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;
};
Неоконченная мысль всегда казалась Шри Япутре слишком
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.