簡體   English   中英

2個半字節結構,分配運算符和位集。 如何?

[英]2 Nibbles Struct, assign operator and bitset. How to?

我有一台舊設備,該設備通過串行端口發送7位字節的大型數組(最高有效位始終為0)。 這些字節被分成兩個半字節發送,因此接收到的字節0abcdefg00000abc 0000defg 所以我創建了一個DoubleByte結構來存儲它們中的每一個:

struct Dbyte {
    BYTE h;
    BYTE l;
};

現在,我有2個問題:

1)我想做的是將每個Dbyte作為普通的基本類型變量進行訪問,因此我嘗試覆蓋一些運算符:

struct Dbyte {
    BYTE h;
    BYTE l;
    Dbyte& operator =(const Dbyte& a) {
        l = a.l; h = a.h;
        return *this;
    }
    Dbyte& operator =(const int& i) {
        l = i&0x0F; h = i>>4 & 0x07;
        return *this;
    }
    int operator = (const Dbyte& a) const {
        return (int)(a.h<<4 + a.l);
    }
};

使用我的代碼,我可以做到:

Dbyte db1, db2;
db1 = 20;
db2 = db1;

但我不能編譯

int i = db1;

我做錯了什么?

2)其中一些Dbytes是位字段(或者低半字節是一個值,高半字節是一個位字段)。 有一種方便的方式可以訪問它們嗎? 我剛剛了解了std :: bitset的存在,但我仍然不知道如何使用它們,在我的夢中,我想寫些類似的東西

if (db1[6]==true) ...

要么

if (db1.bit[6]==true) ...

有辦法獲得這樣的東西嗎?

如果這很重要,那么我正在使用C ++ Builder 2006,但是該項目可以在QTQuick應用程序中進行遷移,因此我更喜歡“ stardard c ++”解決方案。

謝謝

要將您的類型轉換為其他類型,您需要一個轉換(而不是賦值)運算符:

operator int() const {
    return (h<<4) + l;
}

對於相反的轉換,最好使用轉換構造函數,而不是賦值運算符:

DByte(int i) : l(i & 0xf), h((i>>4) & 0xf) {}

這可以用於初始化DByte以及分配給它:

DByte db = 42;  // not assignment - requires a constructor

賦值仍然僅適用於此構造函數,而沒有特殊的賦值運算符-可以使用構造函數轉換整數值,然后使用隱式賦值運算符進行賦值。

最后,這里沒有必要編寫自己的副本構造函數。 隱式的功能完全相同。

int operator = (const Dbyte& a) const試圖成為一個拷貝分配運算符,但不能因為它是const而成為。 您要寫的是: operator int() const

我認為您的int重載=運算符超出了范圍,因為您將其放在了DByte的結構中。 對於您的Dbyte [i] == true概念,請嘗試重載[]運算符以返回布爾值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM