На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Возможно ли получить ID члена класса (или структуры). , Вопрос о получении id либо порядкового номера члена класса или структуры
    Приветствую. Есть класс:

    ExpandedWrap disabled
      class CryptoQuotes
      {
      public:
          float Bitcoin;
          float Ethereum;
          float Dash;
      };



    далее получаю котировки с сервера, в функции задаю новые значение так:


    ExpandedWrap disabled
      cryptoquotes.Bitcoin = data[0];
      cryptoquotes.Ethereum = data[1];
      cryptoquotes.Dash = data[2];



    хотелось бы видеть код следующим образом:

    ExpandedWrap disabled
      for (size_t i = 0; i < datanum; i++)
      {
          cryptoquotes.member[i] = data[i];
      }


    Имена членов важны, так как использую их в коде, поэтому делаю через класс.

    Вопрос в шапке, можно ли как-то получить порядковый номер члена класса? Спасибо!
      Лучше так не делать, получится непереносимое решение. Попробуй подойти к решению с другой стороны. Так проще будет и быстрее.
      Например заведи себе ассоциативный массив, вместо структуры. Или обычный массив.
      Сообщение отредактировано: Wound -
        Как я писал выше, имена важны, т.к. для каждого имени свой обработчик.
          Используй тогда ассоциативный массив. например std::map
            Цитата aceracer @
            хотелось бы видеть код следующим образом:


            for (size_t i = 0; i < datanum; i++)
            {
                cryptoquotes.member[i] = data[i];
            }


            ExpandedWrap disabled
              class CryptoQuotes
              {
               
              public:
                  float Bitcoin;
                  float Ethereum;
                  float Dash;
               
                  float &operator[](size_t i)
                  {
                      switch (i)
                      {
                      case 0: return Bitcoin;
                      case 1: return Ethereum;
                      case 3: return Dash;
                      }
                      static float _fake;
                      return _fake;
                  }
              };
              Цитата Wound @
              Используй тогда ассоциативный массив. например std::map

              Плюсую :)
                Цитата Wound @
                Используй тогда ассоциативный массив. например std::map

                С указателями на члены структуры. То есть int -> float CryptoQuotes::*
                  А можно вот такой финт сделать:

                  ExpandedWrap disabled
                    #include <iostream>
                    using namespace std;
                     
                    using CryptoData = class {
                      public:  
                        float Bitcoin;
                        float Ethereum;
                        float Dash;
                    };
                     
                    union CryptoQuotes {
                      CryptoData Data;
                           float Proxy[sizeof(CryptoData)/sizeof(float)];
                    };
                     
                    int main() {
                      CryptoQuotes Crypto;
                      for(auto i=0; i<3; ++i) Crypto.Proxy[i] = (i+1) * (-1.2);
                      cout << Crypto.Data.Bitcoin  << endl
                           << Crypto.Data.Ethereum << endl
                           << Crypto.Data.Dash     << endl;
                      return 0;
                    }
                    Круто, благодарю за столько вариантов!
                      Цитата aceracer @
                      Круто, благодарю за столько вариантов!

                      Вот еще, на чистом Си, но это Я бы сказал advance C,
                      ExpandedWrap disabled
                         
                        void  structureUpdate(void) __attribute__((constructor)); // for gcc or alv
                                                                                          
                        void structureUpdate() {
                            typedef struct cryptoData{
                                float bitcoin;
                                float ethereum;
                                float dash;
                            } Money;
                            
                            Money money[1];
                            float* ptr = (float*) money;
                            float value=10.25;
                         
                            ptr[0]=value;    
                            ptr[1]=value/2;
                            ptr[2]=value/4;
                          
                            printf(" element = %f %f %f", money->bitcoin, money->ethereum, money->dash);
                            exit(-1);
                        }
                        Цитата JoeUser @
                        using CryptoData = class {
                        public:
                        float Bitcoin;
                        float Ethereum;
                        float Dash;
                        };

                        А чем это от простого class CryptoData отличается?
                          Цитата OpenGL @
                          А чем это от простого class CryptoData отличается?

                          Собственно, ничем. Просто сперва немного не так начал писать, и забыл поправить. Ну так тож ниче.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0340 ]   [ 16 queries used ]   [ Generated: 18.04.24, 11:56 GMT ]