我在Arduino上编写C ++。我在使用memcpy
尝试复制和数组时遇到了问题。
Character characters[5] = {
Character("Bob", 40, 20),
Character("Joe", 30, 10),
...
};
然后我将这个数组传递给像这样的构造函数:
Scene scene = Scene(characters, sizeof(characters)/sizeof(Character));
在这个构造函数中,我尝试使用memcpy复制字符:
memcpy(this->characters, characters, characters_sz);
这似乎锁定了我的应用程序。经过研究,似乎memcpy不适合这项工作。如果我评论该行,则应用程序的其余部分继续冻结。
我无法使用向量,因为它们在Arduino上不受支持,std::copy
也不支持。调试很痛苦。
有没有办法做到这一点?
我复制的原因是因为多个对象将获得自己的字符副本。因为副本,每个类都可以相应地修改和销毁它们。我不想让Scene
班级负责创建角色,所以我宁愿将它们传入。
答案 0 :(得分:1)
您必须单独复制成员,或在Character
class / struct
答案 1 :(得分:0)
目前还不清楚代码中发生了什么。
首先,您没有使用std::array
,因为您的问题标题显示,您使用的是内置数组。
您可以简单地使用std::array
,而只使用std::array
的复制构造函数。但这带来了第二个问题。
当您在memcpy
的构造函数中执行Scene
时,this->characters
的实际大小是多少?拥有一个动态characters_sz
的构造函数是不是一件好事,如果实际上它有多少可以接受的静态限制。
如果我是你并且真的试图避免动态分配和std::vector
,我会使用std::array
来表示Scene
的成员和你传递的临时变量,以及我会使构造函数成为一个模板,以便它可以接受任意大小的std::array
个字符。但是,我会设置一个静态断言,这样如果传递的数组的大小太大,它就会在编译时失败。
另外假设你在这里使用C ++ 11。
我想根据您的应用,这种策略不合适。可能是数组的大小确实需要在运行时变量,但您仍然不想进行动态分配。在这种情况下,您可以查看boost::static_vector
。
http://www.boost.org/doc/libs/1_62_0/doc/html/container/non_standard_containers.html
boost::static_vector
基本上就像一个堆分配的缓冲区,大到足以容纳N个对象,但它肯定不会默认构造它们的N,你可能只有一个或两个等等。它会跟踪其中有多少实际存活,并且基本上像堆栈分配std::vector
,容量限制为N
。
答案 2 :(得分:0)
使用std::copy_n
:
std::copy_n(characters, num_characters, this->characters);
请注意,参数的顺序与memcpy
不同,数字是元素的数量,而不是这些元素的大小。您还需要在源文件的顶部显示#include <algorithm>
。
也就是说,你最好使用std::vector
而不是固定大小的数组,这样你就可以使用简单的赋值来复制它,你可以动态地增长和缩小它。