将包含循环缓冲区的 class 添加到 Vector
Add class containing a circular buffer to Vector
我正在尝试创建一个充满 class 个对象的向量,并且 class 个对象包含循环缓冲区作为其成员之一。我 运行 遇到了这个错误:
In file included from .pio/libdeps/teensy40/Vector/src/Vector.h:95:0,
from src/main.cpp:2:
.pio/libdeps/teensy40/Vector/src/Vector/VectorDefinitions.h: In instantiation of 'void Vector<T>::push_back(const T&) [with T = Node]':
src/main.cpp:25:27: required from here
.pio/libdeps/teensy40/Vector/src/Vector/VectorDefinitions.h:162:22: error: use of deleted function 'Node& Node::operator=(const Node&)'
values_[size_++] = value;
^
src/main.cpp:5:7: note: 'Node& Node::operator=(const Node&)' is implicitly deleted because the default definition would be ill-formed:
class Node
^
src/main.cpp:5:7: error: use of deleted function 'CircularBuffer<T, S, IT>& CircularBuffer<T, S, IT>::operator=(const CircularBuffer<T, S, IT>&) [with T = long unsigned int; unsigned int S = 100u; IT = unsigned char]'
In file included from src/main.cpp:3:0:
.pio/libdeps/teensy40/CircularBuffer/CircularBuffer.h:64:18: note: declared here
CircularBuffer& operator=(const CircularBuffer&) = delete;
^
*** [.pio/build/teensy40/src/main.cpp.o] Error 1
======================================== [FAILED] Took 0.99 seconds ========================================
我创建了一个程序,它是我可以复制错误的最少代码:
#include <Arduino.h>
#include <Vector.h>
#include <CircularBuffer.h>
class Node
{
CircularBuffer<uint32_t, 100> RTTSamplesBuffer;
};
// Vector to hold the nodes we currently have saved
Vector<Node> Nodes;
// This stuff is used in setup to make the vector not use dynamic allocation
// This version of the Vector library is special for arduino so it is not
// dynamically allocating the vector to prevent filling the controllers memory
const int NODE_COUNT_MAX = 20;
Node storage_array[NODE_COUNT_MAX];
void setup()
{
Serial.begin(115200);
// Point the vector to it's storage location.
Nodes.setStorage(storage_array);
while (!Serial)
;
// Create Node I want to add to the vector
Node testNode;
// Try and add the Node to the vector.
Nodes.push_back(testNode);
while (1)
;
}
void loop()
{
// put your main code here, to run repeatedly:
}
我正在为循环缓冲区使用 this library for vectors as it is compatible with Arduino and won't fill up the memory, and I am using this 库。谢谢!
查看循环缓冲区的代码:
CircularBuffer(const CircularBuffer&) = delete;
CircularBuffer(CircularBuffer&&) = delete;
CircularBuffer& operator=(const CircularBuffer&) = delete;
CircularBuffer& operator=(CircularBuffer&&) = delete;
这意味着循环缓冲区一旦分配,就不能以任何方式移动或复制。它保持原样,并且这也将适用于具有其中之一作为成员的任何类型。
添加一个间接级别,使 CircularBuffers 仅被引用,而不是被复制,将使您摆脱困境。
大致是这样的:
class Node
{
using buffer_type = CircularBuffer<uint32_t, 100>;
buffer_type* RTTSamplesBuffer = nullptr;
public:
set_buffer(buffer_type* b) {
RTTSamplesBuffer = b;
}
};
const int NODE_COUNT_MAX = 20;
Node storage_array[NODE_COUNT_MAX];
Node::buffer_type buffers[NODE_COUNT_MAX];
void setup()
{
for(int i=0; i<NODE_COUNT_MAX; ++i) {
storage_array[i].set_buffer(&buffers[i]);
}
// ...
}
通常这是“应该”对 0/3/5 的规则感到不安的地方。但是,只要这些是指向全局分配对象的指针,就不是绝对必要的。
我正在尝试创建一个充满 class 个对象的向量,并且 class 个对象包含循环缓冲区作为其成员之一。我 运行 遇到了这个错误:
In file included from .pio/libdeps/teensy40/Vector/src/Vector.h:95:0,
from src/main.cpp:2:
.pio/libdeps/teensy40/Vector/src/Vector/VectorDefinitions.h: In instantiation of 'void Vector<T>::push_back(const T&) [with T = Node]':
src/main.cpp:25:27: required from here
.pio/libdeps/teensy40/Vector/src/Vector/VectorDefinitions.h:162:22: error: use of deleted function 'Node& Node::operator=(const Node&)'
values_[size_++] = value;
^
src/main.cpp:5:7: note: 'Node& Node::operator=(const Node&)' is implicitly deleted because the default definition would be ill-formed:
class Node
^
src/main.cpp:5:7: error: use of deleted function 'CircularBuffer<T, S, IT>& CircularBuffer<T, S, IT>::operator=(const CircularBuffer<T, S, IT>&) [with T = long unsigned int; unsigned int S = 100u; IT = unsigned char]'
In file included from src/main.cpp:3:0:
.pio/libdeps/teensy40/CircularBuffer/CircularBuffer.h:64:18: note: declared here
CircularBuffer& operator=(const CircularBuffer&) = delete;
^
*** [.pio/build/teensy40/src/main.cpp.o] Error 1
======================================== [FAILED] Took 0.99 seconds ========================================
我创建了一个程序,它是我可以复制错误的最少代码:
#include <Arduino.h>
#include <Vector.h>
#include <CircularBuffer.h>
class Node
{
CircularBuffer<uint32_t, 100> RTTSamplesBuffer;
};
// Vector to hold the nodes we currently have saved
Vector<Node> Nodes;
// This stuff is used in setup to make the vector not use dynamic allocation
// This version of the Vector library is special for arduino so it is not
// dynamically allocating the vector to prevent filling the controllers memory
const int NODE_COUNT_MAX = 20;
Node storage_array[NODE_COUNT_MAX];
void setup()
{
Serial.begin(115200);
// Point the vector to it's storage location.
Nodes.setStorage(storage_array);
while (!Serial)
;
// Create Node I want to add to the vector
Node testNode;
// Try and add the Node to the vector.
Nodes.push_back(testNode);
while (1)
;
}
void loop()
{
// put your main code here, to run repeatedly:
}
我正在为循环缓冲区使用 this library for vectors as it is compatible with Arduino and won't fill up the memory, and I am using this 库。谢谢!
查看循环缓冲区的代码:
CircularBuffer(const CircularBuffer&) = delete;
CircularBuffer(CircularBuffer&&) = delete;
CircularBuffer& operator=(const CircularBuffer&) = delete;
CircularBuffer& operator=(CircularBuffer&&) = delete;
这意味着循环缓冲区一旦分配,就不能以任何方式移动或复制。它保持原样,并且这也将适用于具有其中之一作为成员的任何类型。
添加一个间接级别,使 CircularBuffers 仅被引用,而不是被复制,将使您摆脱困境。
大致是这样的:
class Node
{
using buffer_type = CircularBuffer<uint32_t, 100>;
buffer_type* RTTSamplesBuffer = nullptr;
public:
set_buffer(buffer_type* b) {
RTTSamplesBuffer = b;
}
};
const int NODE_COUNT_MAX = 20;
Node storage_array[NODE_COUNT_MAX];
Node::buffer_type buffers[NODE_COUNT_MAX];
void setup()
{
for(int i=0; i<NODE_COUNT_MAX; ++i) {
storage_array[i].set_buffer(&buffers[i]);
}
// ...
}
通常这是“应该”对 0/3/5 的规则感到不安的地方。但是,只要这些是指向全局分配对象的指针,就不是绝对必要的。