在this question的回答中我被告知我的问题在于下面代码中对复制构造函数的调用。但是,我只是看不到它被调用的位置。我无处可能做agents[1] = agents[0];
之类的事情,虽然显然我不明白。这种复制发生在哪里?如何更改它,以便每次只创建新对象?
我一直
int main()
{
Level* level;
std::vector<Agent> agents;
level = new Level(agents);
for (int i = 0; i < 1; i++) // this will be more than 1 in the future.
{
agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));
}
delete level;
}
答案 0 :(得分:6)
正如其他人所说,push_back
会在副本中插入副本。
如果您的编译器支持某些C ++ 11,则可能是通过将对象直接构造到向量中来避免此副本。新的emplace_back
函数执行此操作:
agents.emplace_back(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f));
此外,如果编译器对移动语义具有C ++ 11支持,push_back
将执行移动操作而不是复制操作(如果移动构造函数可用于Agent
,因为你'把它当作临时的。
答案 1 :(得分:2)
下面:
agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));
这将创建一个临时Agent
对象,并在vector
中推送它的副本。
答案 2 :(得分:0)
在下面的一行中,您将创建一个临时代理并将其复制到通过传递临时代理在代理中创建的新代理。
agents.push_back(代理(100,*级别,代理,级别 - &gt;分拣(),D3DXCOLOR(1.0F,0.4f,0.4f,1.0f)));
答案 3 :(得分:0)
您的std::vector::push_back
具有复制语义。它必须调用Agent::Agent(Agent const&)
。
你不能使用std::vector
与没有有意义的复制构造函数的东西。您可能不得不求助于指针向量(具有普通的复制构造函数)。