如何复制包含非基本类型的数组?

时间:2017-03-11 19:22:17

标签: c++ arduino

我在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班级负责创建角色,所以我宁愿将它们传入。

3 个答案:

答案 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而不是固定大小的数组,这样你就可以使用简单的赋值来复制它,你可以动态地增长和缩小它。