Доступ к элементам структуры с использованием функции без аргументов - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь создать структуру, которая должна содержать байт и облегчить доступ к ним. Целевой код должен работать с моей структурой следующим образом:

    data8_t data;
    data = 7;
    unsigned char temp_data = data; 
    cout << "6th bit value = " << data.toBits().b6 << endl;
    data.toBits().b2 = 1;

Однако я не могу понять, как кодировать детали, содержащие:

data.toBits().b6 
data.toBits().b2

Как я могу использовать идентификатор элемента после Вызов функции без аргументов, которая также принадлежит структуре?

Переменные, содержащие битовые поля, специально просят иметь длину в один байт, и моя структура data8_t в настоящее время выглядит следующим образом:

struct data8_t{
    uint8_t data;
    uint8_t b0;
    uint8_t b1;
    uint8_t b2;
    uint8_t b3;
    uint8_t b4;
    uint8_t b5;
    uint8_t b6;
    uint8_t b7;

data8_t(){
      b0=(data & 0x01)>>0;
      b1=(data & 0x02)>>1;
      b2=(data & 0x04)>>2;
      b3=(data & 0x08)>>3;
      b4=(data & 0x10)>>4;
      b5=(data & 0x20)>>5;
      b6=(data & 0x40)>>6;
      b7=(data & 0x80)>>7;
}

template <typename T>
    void operator=(T rhs){
        data = (uint8_t) rhs;
        b0=(data & 0x01)>>0;
        b1=(data & 0x02)>>1;
        b2=(data & 0x04)>>2;
        b3=(data & 0x08)>>3;
        b4=(data & 0x10)>>4;
        b5=(data & 0x20)>>5;
        b6=(data & 0x40)>>6;
        b7=(data & 0x80)>>7;
    }

    operator unsigned char() const{
        return (unsigned char) data;
    }
};

It не элегантно, но работает для:

data = 7;
unsigned char temp_data = data; 

1 Ответ

0 голосов
/ 26 февраля 2020

Вы должны попытаться использовать c ++ bitfield , он должен делать именно то, что вы хотите, и избегать дублирования данных. Вы можете реализовать это так, например:

struct data8_t
{
    template <typename T>
    void operator=(T rhs) {
        data = (uint8_t)rhs;
    }
    union
    {
        uint8_t data;
        struct {
            uint8_t b0 : 1,
            b1 : 1,
            b2 : 1,
            b3 : 1,
            b4 : 1,
            b5 : 1,
            b6 : 1,
            b7 : 1;
        };
    };
};

Используйте это так:

int main()
{
    data8_t b;
    for(int i = 0; i < 15; i++)
    {
        b = i;
        std::cout << (uint32_t)b.b0 << (uint32_t)b.b1 << (uint32_t)b.b2 << (uint32_t)b.b3 << (uint32_t)b.b4 << (uint32_t)b.b5 << (uint32_t)b.b6 << (uint32_t)b.b7 << std::endl;
    }
}

Если вы действительно хотите иметь функцию для доступа к ней, я полагаю, вы можете сделать что-то вроде что:

struct data8_t
{
    struct bitfield
    {
        template <typename T>
        void operator=(T rhs) {
            data = (uint8_t)rhs;
        }

        operator unsigned char() const {
            return (unsigned char)data;
        }

        union
        {
            uint8_t data;
            struct
            {
                uint8_t b0 : 1,
                    b1 : 1,
                    b2 : 1,
                    b3 : 1,
                    b4 : 1,
                    b5 : 1,
                    b6 : 1,
                    b7 : 1;
            };
        };
    };

    template <typename T>
    void operator=(T rhs) {
        _data = (uint8_t)rhs;
    }

    operator unsigned char() const {
        return (unsigned char)_data;
    }

    bitfield& toBits() { return _data; }

private:
    bitfield _data;
};

Редактировать - заставить toBits работать с побитовым оператором присваивания

...