c++ - C++如何定义操作符[]来读写循环缓冲区的一项
问题描述
我创建了一个实现循环缓冲区的模板类。缓冲区由具有类型 T 的值的项目组成。
我想定义 operator[ ] 来写入和读取缓冲区的元素。即使我尝试读取已经初始化的元素,结果也是:分段错误:11
这是 operator[ ] 的代码:
// read
const T& operator[](size_type index) const {
assert(index < _size);
item *curr = _buffer + index;
return curr->value;
}
// read and write
T &operator[](size_type index) {
assert(index < _capacity);
item *curr = _buffer + index;
if (index < _size) {
return curr->value;
}
else {
_size++;
return curr->value;
}
}
我如何在 main.cpp 中使用 operator[ ] 的示例:
cbuffer<int> b(4);
std::cout << "b: " << b << std::endl;
std::cout << "capacity: " << b.capacity() << std::endl;
assert(b.capacity() == 4);
std::cout << "size: " << b.size() <<
std::endl;
assert(b.size() == 0);
b[0] = 1;
b[1] = 3;
当我尝试在缓冲区中写入新项目时发生错误。
有什么方法可以定义有效的 operator[]?
解决方案
我有点猜测,因为您没有提供足够的上下文(如果没有看到课程的其余部分,很难判断课程的一小部分是否正确)。但它似乎_buffer
是一个链表。item 结构中的next
指针给出了它
typedef struct item {
T value;
item *next;
};
但是您的operator[]
代码假定这_buffer
是一个数组,
item *curr = _buffer + index;
在指针上使用+
假设指针指向一个连续的内存块,但是因为您有一个链表,但您的情况并非如此。
相反,您需要编写一个循环,循环遍历您的链表,直到找到正确的项目。像这样的东西
item *curr = _buffer;
while (index > 0) {
curr = curr->next;
--index;
}
return curr->value;
推荐阅读
- variables - 使用变量或信号进行 VHDL 索引?
- python - 全局名称 chat_id 未定义
- python - 使用分布式训练时,何时必须在 Pytorch 中调用 share_memory_()?
- google-cloud-platform - 有没有办法在大于一定大小的谷歌云存储桶中找到所有文件/对象?
- ios - 唯一标识 iOS 设备 iOS 12+(即使在重新安装应用程序后) - 或 UDID 的替代品
- java - BufferedImage 即使在缩放后也会使用内存
- google-cloud-platform - 在不同项目中共享托管区域
- python - 在 Rhel5 服务器上启用 Ansible 执行
- javascript - 怎么逃?带有角度的router.navigate的符号?
- c++ - 如何判断是否有任何额外的输入?