在库中定义数组大小,而不必为每次新使用进行修改
Define array size in library without modifying it for every new use?
示例:类(库)使用默认固定大小的数组。比方说64字节。然而,在程序中,您可能需要更大的大小,比如128字节。如果你不想每次都重写库,最好的方法是什么?
我试图通过以下错误代码(使用#ifndef
#define
)来证明这一点:
// myClass.h *****************************************
#ifndef myClass_h
#define myClass_h
#ifndef EXAMLPE
#define EXAMLPE 64
#endif
class myClass{
...
private:
byte myArray[EXAMLPE]; // Use EXAMLPE to allocate array
}
#endif
// Program.ino ***************************************
// Override the default value without modifying the library
#define EXAMLPE 128
#include "myClass.h"
// this does not work because of different scope, says compiler
编辑:我想制作固定大小的阵列,因为它很容易,而且在2kb RAM平台上被认为是很好的实践
第2版:我不明白评论中所有的争论,也不明白为什么我的问题被降级了。当然,我不是一个优秀的程序员,我对向量和模板一无所知,这就是我在这里寻求帮助的原因。
我正在寻找一种方法,如何在编译时从主代码中设置库中的固定大小数组
最后:有人知道我删除#ifndef EXAMPLE时为什么会出现编译错误EXAMPLE was not declared in this scope
吗#头中的endif行?它不应该是独立于范围的吗?
编译时间
如果您的大小是在编译时定义的,那么您可以使用一个以大小为模板参数的模板类。
template<int EXAMPLE>
class myClass{
...
private:
byte myArray[EXAMPLE];
};
或者您可以使用std::array
容器。
与。运行时间
然而,固定大小的阵列不是很灵活。因此,我强烈建议使用矢量。您不仅可以为向量设置默认大小,而且可以动态调整此大小,而无需担心内存管理、复制构造函数、赋值运算符等。
class myClass {
public:
myClass(int mysize=64) : myVector(mysize) {}
private:
std::vector<byte> myVector; // no size needed here
};
为什么不用数组代替向量,并定义操作向量最大大小的方法。所以类似于:
#include <vector>
myClass{
private:
vector<int> v;
int maxSize
public:
myClass(int size){
v.reSize(size);
maxSize = size;
}
void add(int byte){
if(v.size()<maxSize){
v.push_back
}
}
}
C++不支持运行时大小的数组因此,如果您在编译时不知道需要多大的内存,那么数组是执行任务的错误工具。相反,我建议让您的对象只包含一个指针,然后使用new根据一些运行时值动态分配数据块。
请注意,以下代码只是为了演示上面表达的想法,没有经过测试,可能也不会编译。
class myClass {
private:
byte *myData;
public:
myClass(std::size_t dataSize) :
myData(new byte[dataSize])
{}
myClass(const myClass&) = delete;
myClass(myClass&&) = delete;
myClass& operator=(const myClass&) = delete;
myClass& operator=(myClass&&) = delete;
~myClass()
{
delete[] myData;
}
};
另一方面,如果在编译时大小是已知的,但您不希望每次需要更改大小时都编辑头文件,则可以使用模板类,这允许用户在使用该类时提供编译时参数。例如:
template<size_t dataSize>
class myClass {
private:
byte myArray[dataSize];
};
然后可以使用编译时已知的自定义大小创建类,如下所示:
auto foo = myClass<128>();
Arduino IDE在将.ino文件转换为单个.cpp文件时会有一些技巧
- 创建函数原型
- 最终重新排序#include(?)
这可能会推迟
#define EXAMLPE 128
我认为模板解决方案最适合arduino。矢量和动态内存使用仅使用2kB RAM(在UNO上)是非常危险的。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用新行和不使用新行读取文件
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 如何使用CLion在Mac上创建一个新的.txt文件
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 有没有一种优雅的方法可以使用向量修改器并获得新的向量,而不是更改原始向量
- 我如何使用此二叉搜索函数的修改后的最大/最小值创建新数组
- 使用C 修改Java方法/字节码
- 如何使用 *& 修改对象 C++
- 使用修改'scratchpad'变量的 const 函数是否正确?
- 如何使用 c++ 修改文本文件的 "Date modified" 属性而不影响内容?
- 生成文件 - 使用修改后的头文件重建
- 使用我的API修改新运算符
- 考虑到一些函数是const而另一些函数是非const, QString的正确使用/修改
- 是否可以在重载中使用修改后的返回引用,例如"int &operator[]"?
- 在库中定义数组大小,而不必为每次新使用进行修改
- 使用修改后的指向常量的指针返回指向非常量的指针
- 使用修改的反向波兰符号求解方程
- 如何使用修改后的DLGTEMPLATEEX调用CDialog::DoModal()