我正在与图书馆合作开展一个项目,我必须与工会合作。具体来说,我正在与 SDL 合作,SDL_事件联合 http://www.libsdl.org/cgi/docwiki.cgi/SDL_Event。我需要复制 SDL_Events,但找不到有关使用联合重载赋值运算符的良好信息。
假设我可以重载赋值运算符,我是否应该手动筛选联合成员并复制相关成员,或者我可以简单地加入一些成员(这对我来说似乎很危险),或者也许只是使用 memcpy() (这看起来简单而快速) ,但有点危险)?
如果我不能重载运算符,我最好的选择是什么?我想我可以制作新副本并传递一堆指针,但在这种情况下我宁愿不这样做。
欢迎任何想法!
编辑:
按照要求的错误消息,顺便说一句,我想我学到了一些东西......
physworld.cpp:325: error: no match for ‘operator=’ in ‘CurrentEvent = ((physworld*)this)->physworld::SDL_UserInputEvents.std::queue<_Tp, _Sequence>::pop [with _Tp = SDL_Event, _Sequence = std::deque<SDL_Event, std::allocator<SDL_Event> >]()’
/usr/include/SDL/SDL_events.h:220: note: candidates are: SDL_Event& SDL_Event::operator=(const SDL_Event&)
编辑2:
这太愚蠢了...我以为 Deqeues pop() 成员返回了删除的项目。我以为代码太简单了,不可能直接是我的代码,但事实证明这是错误的。
我的代码看起来像:
for(SDL_Event CurrentEvent; !DequeueOfSDLEvents.empty(); CurrentEvent = DequeueOfSDLEvents.pop() )
{
//Do stuff
}
因此,如果没有别的事情,我将学习更仔细地研究我最近没有使用过的容器的成员函数。感谢您解释默认情况下的分配工作,否则需要更长的时间才能找到它。
在联合体中,所有元素都占用相同的内存,就像它们彼此叠置一样。如果写入联合的另一个元素,它会覆盖其他元素。
因此,逐个元素复制是浪费时间。您可以仅复制最大的元素,但是您必须知道那是哪一个(并非并集的每个元素都必须具有相同的大小)最好的做法是仅 memcpy 并集。
但它比这更简单,你应该能够只做一个赋值,编译器意识到你正在复制一个结构或联合,会隐式地为你做“memcpy”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)