如何使用boost :: dynamic_bitset为类设置overload()运算符

时间:2018-01-26 12:49:36

标签: c++ boost byte bit bitset

我创建了一个模拟来自bitset的2d数据集的类。这是我到目前为止所创造的内容:

class Data
{
    private: 
        int width_; 
        int height_; 
        boost::dynamic_bitset<> * bitset_; dynamicznie

    public:
        Data() : width_(0), height_(0) {} 
        Data(int width,  int height) : width_(width), height_(height) 
        {
            bitset_ = new boost::dynamic_bitset<>(width * height); 
        }

    boost::dynamic_bitset<>::reference & operator()(const int x, const int y)
    {
        return bitset_[x * height_ + y];
    }

};

不幸的是,这不起作用,它表示错误:

boost::dynamic_bitset<>::reference & operator()(const int x, const int y)
    {
        return bitset_[x * height_ + y];
    }

我希望能够像这样在这个类的实例中操作bitset:

Data data = new Data(10, 10);
bool i = 1
data(0, 1) = i;

3 个答案:

答案 0 :(得分:1)

显然,dynamic_bitset自己提供了一个operator []。您已将其声明为指针,因此方括号被视为该指针的索引访问;它将您的指针视为指向数组的指针,并返回该数组的(未存在和未分配)元素,该元素是对dynamic_bitset的(悬空)引用,而不是对单个位的引用。

是否有任何真正的理由让该成员成为指针?您甚至不会在复制/分配/销毁中处理它,因此违反了规则五。只需使它成为一个对象成员,而不是指向堆上分配的东西的指针:

    boost::dynamic_bitset<> bitset;
public:
    Data(int w, int h): width_(w), height_(h), bitset(w * h) {}

P.S。如果你没有真正使用负尺寸,std::size_t作为尺寸大小更有意义。

答案 1 :(得分:1)

bitset_是一个指针,您应该在使用

之前取消引用它
    (*bitset_)[x * height_ + y];

并记住operator[] dynamic_bitset返回临时对象

  

引用运算符[](size_type pos);

     

bool operator [](size_type pos)const;

您无法将其分配给L值参考 - dynamic_bitset<>::reference&。因此,您应该按如下方式定义operator()

boost::dynamic_bitset<>::reference  operator()(const int x, const int y)
{
    return (*bitset_)[x * height_ + y];
}

答案 2 :(得分:0)

我无法发布其他问题,所以我会在此发布。我想了解从IFS函数生成分形的算法。此算法代码在此处: http://www.algorytm.org/fraktale/system-funkcji-iterowanych-ifs/ifs-c.html 但我无法理解minX,minY,maxX,maxY,ratioX,ratioY变量的目的是什么。我不能。我一直在思考,并且无法弄清楚。

有趣的是,这些valubes必须设置为特定值。否则算法无法正常工作(我已经测试过了)。