【问题标题】:define operator[] for assignment and for reading定义 operator[] 用于赋值和读取
【发布时间】:2016-10-10 19:02:10
【问题描述】:

对于以下两种情况,operator[]可以有两个定义吗?

  • My_bit_array[7] = true;

  • bool x = My_bit_array[0];

这很有用,因为读取位和切换字节的 8 位之一 (uint8_t) 是不同的。这两种情况需要两种不同的定义。

【问题讨论】:

  • @Rakete1111:他好像在实现一个bitset,你不能返回一个bit的引用。
  • @Benjamin OP 可以返回对代理对象的引用,这有点像 std::bitset,对吧?
  • 看起来您正在尝试制作自己的bitset。您可以查看standard one 了解他们是如何做到的。
  • @Rakete1111:是的,他可以做到,这就是答案的开始。

标签: c++ operator-overloading


【解决方案1】:

这很简单。它应该使用代理对象来实现,正如在 cmets 中已经提到的那样。我想是这样的:

#include <iostream>
#include <cstddef>

using namespace std;

struct proxy_obj;

struct my_bit_array
{
    uint8_t bit_array_;

    proxy_obj operator[](int n);
};

struct proxy_obj
{
    my_bit_array& my_bit_array_;
    int n_;

    proxy_obj(my_bit_array& bit_array, int n) 
        : my_bit_array_(bit_array), n_(n) {}

    proxy_obj& operator=(bool b)
    {
        uint8_t set_mask = 0x01 << n_;

        if(b) my_bit_array_.bit_array_ |= set_mask;
        else  my_bit_array_.bit_array_ &= (~set_mask);

        return *this;
    }

    operator bool(){ return my_bit_array_.bit_array_ & (0x01 << n_); }
};

proxy_obj my_bit_array::operator[](int n)
{
    return proxy_obj(*this, n);
}

int main() {
    my_bit_array bit_set;

    bit_set[0] = false;
    bool b = bit_set[0];
    cout << b << endl;

    bit_set[3] = true;
    b = bit_set[3];
    cout << b << endl;

    return 0;
}

【讨论】:

    【解决方案2】:

    您可以重载下标运算符“[]”以返回要分配的元素的地址。

    您不能返回对位的引用,因为位没有地址,最小的可寻址变量是 1 个字节(bool 或 char),由 8 个位组成。

    #include <iostream>
    using namespace std;
    
    class Byte
    {   
        public:
            Byte(bool[], int);
            ~Byte() {delete[] itsBits;}
    
            bool& operator[](int);
    
        private:
    
            bool* itsBits;
            int  itsLength;
    };
    
    Byte::Byte(bool bits[], int length) : 
        itsLength(length)
    {
        itsBits = new bool[itsLength];
        for(int i(0); i < itsLength; i++)
            itsBits[i] = bits[i];
    }
    
    bool& Byte::operator [](int index)
    {
        if(index < 0 || index > itsLength)
            return itsBits[0];
        else
            return itsBits[index];
    }
    
    int main()
    {
    
        bool bArray[] = {true, false, true, true, false, true, false, true};
        Byte theByte(bArray, 8);
    
        cout << theByte[2] << endl;
    
        theByte[2] = false; // invoking bool& operator[] it returns a reference the 3rd element in array so we can assign to it value
    
        cout << theByte[2] << endl;
        cout << theByte[6] << endl; 
    
        for(int i(0) ; i < 8; i++)
            cout << theByte[i] << " "; 
    
        cout << endl << endl << endl;
        return 0;
    }
    

    【讨论】:

    • 这只是一个bool的数组,与访问一个字节中的单个位完全不同。
    • cmets 也是错误的,cout 行不会调用const 成员。
    • @BenVoigt 我知道在他的情况下这是布尔数组,这是唯一的方法,因为。如何返回位的“地址”?
    • 我知道您已经看过问题下的 cmets,因为您参与了他们。所以你知道std::vector&lt;bool&gt;std::bitset 都被提及了。这些确实返回一个引用对象(不是 C++ 引用,而是一个定位器对象,就像一个仿函数不是一个函数但可以像一个函数一样被调用,这个定位器对象可以用来读取或改变它的目标,即使它不是一个指针或参考)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多