[英]How do I copy arrays that contain non primitive types?
我在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
类负责创建角色,所以我宁愿将它们传递给我。
您将必须分别复制成员,或在Character
类/结构中创建复制构造函数
尚不清楚代码中正在发生什么。
首先,您没有使用问题标题所建议的std::array
,而是使用了内置数组。 您可以方便地使用std::array
,而只需使用std::array
副本构造函数。 但这使我们想到了第二个问题。
当您在Scene
的构造函数中执行memcpy
时, this->characters
的实际大小是多少? 如果实际上可以容纳多少个静态限制,那么拥有一个动态获取characters_sz
的构造函数并不是一件好事。
如果我是您,并且确实在尝试避免动态分配和std::vector
,那么我将对所有两个对象( Scene
成员和您要传递的临时变量)使用std::array
,并且将构造函数设为模板,因此它可以接受任意大小的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
使用std::copy_n
:
std::copy_n(characters, num_characters, this->characters);
请注意,参数的顺序与memcpy
不同,数字是元素的数量,而不是元素的大小。 您还需要在源文件顶部#include <algorithm>
。
就是说,您最好使用std::vector
而不是固定大小的数组,这样,您可以使用简单的赋值来复制它,并且可以动态地对其进行缩放。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.