免责声明 - 这是一项学校作业,但我希望这个问题仍然很有意思!
我实现了一个名为Vector<bool>
的自定义类,它将bool
条目存储为数字数组中的位。
除了实现这一点外,一切都很顺利:
bool& operator[](std::size_t index) {
validate_bounds(index);
???
}
const
实现非常简单,只需读出值即可。然而,我无法理解该怎么做,而且该课程是关于C ++的专业课程,因此我猜测我应该做一些类型deffing或其他什么。数据由unsigned int
类型的数组表示,并且应该是动态的(例如push_back(bool value)
应该实现)。
答案 0 :(得分:1)
我解决了这个实现代理类:
class BoolVectorProxy {
public:
explicit BoolVectorProxy(unsigned int& reference, unsigned char index) {
this->reference = &reference;
this->index = index;
}
void operator=(const bool v) {
if (v) *reference |= 1 << index;
else *reference &= ~(1 << index);
}
operator bool() const {
return (*reference >> index) & 1;
}
private:
unsigned int* reference;
unsigned char index;
};
在主课堂内:
BoolVectorProxy operator[](std::size_t index) {
validate_bound(index);
return BoolVectorProxy(array[index / BLOCK_CAPACITY], index % BLOCK_CAPACITY);
}
我也使用Catch作为测试库,代码通过了这个测试:
TEST_CASE("access and assignment with brackets", "[Vector]") {
Vector<bool> a(10);
a[0] = true;
a[0] = false;
REQUIRE(!a[0]);
a[1] = true;
REQUIRE(a[1]);
const Vector<bool> &b = a;
REQUIRE(!b[0]);
REQUIRE(b[1]);
a[0] = true;
REQUIRE(a[0]);
REQUIRE(b[0]);
REQUIRE(b.size() == 10);
REQUIRE_THROWS(a[-1]);
REQUIRE_THROWS(a[10]);
REQUIRE_THROWS(b[-1]);
REQUIRE_THROWS(b[10]);
}
如果有人发现任何问题或改进,请发表评论,谢谢!