C++ 在这段代码中,我在哪里调用复制构造函数?
在对的回答中,我被告知我的问题在于调用下面代码中的复制构造函数。然而,我只是看不到它在哪里被调用。我在任何地方都没有做过像C++ 在这段代码中,我在哪里调用复制构造函数?,c++,copy-constructor,C++,Copy Constructor,在对的回答中,我被告知我的问题在于调用下面代码中的复制构造函数。然而,我只是看不到它在哪里被调用。我在任何地方都没有做过像agents[1]=agents[0]虽然我显然不明白什么。这种复制发生在哪里?我如何更改它,使其每次都只生成新对象 我一直在 int main() { Level* level; std::vector<Agent> agents; level = new Level(agents); for (int i = 0; i &l
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;
}
intmain()
{
级别*级别;
std::载体试剂;
级别=新级别(代理);
对于(int i=0;i<1;i++)//这在将来将超过1。
{
Agent.push_back(Agent(100,*级别,Agent,级别->Pickups(),D3DXCOLOR(1.0F,0.4f,0.4f,1.0F));
}
删除级别;
}
在下面的一行,您正在创建一个临时代理,并将其复制到一个新代理中,该代理通过传递临时代理在代理中创建
Agent.push_back(Agent(100,*级别,Agent,级别->Pickups(),D3DXCOLOR(1.0F,0.4f,0.4f,1.0F)) 在下面的一行,您正在创建一个临时代理,并将其复制到通过传递临时代理在代理内创建的新代理中
Agent.push_back(Agent(100,*级别,Agent,级别->Pickups(),D3DXCOLOR(1.0F,0.4f,0.4f,1.0F)) 这里:
agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));
这将创建一个临时的代理
对象,并在向量
中获取该对象的副本,如下所示:
agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));
这将创建一个临时的代理
对象,并在向量
中获取该对象的副本。您的std::vector::push_back
具有复制语义。它必须调用Agent::Agent(Agent const&)
不能将std::vector
与没有有意义的复制构造函数的内容一起使用。您可能必须求助于指针向量(它们具有简单的复制构造函数)。您的std::vector::push_back
具有复制语义。它必须调用Agent::Agent(Agent const&)
不能将std::vector
与没有有意义的复制构造函数的内容一起使用。您可能必须求助于指针向量(它们具有简单的副本构造函数)。正如其他人所说,push_back
将在向量中插入副本
如果你有一个支持C++11的编译器,那么你可以通过直接将对象构造到向量中来避免这种复制。新的emplace\u back
功能执行以下操作:
agents.emplace_back(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f));
此外,如果编译器对移动语义有C++11支持,push_back
将执行移动操作,而不是复制操作(如果移动构造函数可用于Agent
),因为您要传递它一个临时值。正如其他人所说,push_back
将在向量中插入一个副本
如果你有一个支持C++11的编译器,那么你可以通过直接将对象构造到向量中来避免这种复制。新的emplace\u back
功能执行以下操作:
agents.emplace_back(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f));
此外,如果编译器支持C++11移动语义,push_back
将执行移动操作,而不是复制操作(如果移动构造函数可用于Agent
),因为您要传递它一个临时值。我想您仅在stackoverflow上使用指向Level的指针,而不是在真正的代码中,对象更合适吗?@TristramGräbener:如果Level
真的很大,那么它可能不仅仅是为了StackOverflow(站点)而堆积,而是为了防止堆栈溢出(错误)。拥有真正巨大的对象是相当困难的(使用数组除外,我不鼓励使用向量)。他取消了对level的引用,将其传递给Agent的构造函数,所以我不认为它的大小是一个真正的问题(当然,它可能会作为引用传递…谁知道呢)我不明白,创建一个新的level并使用指针引用它有什么问题?我想您使用指向level的指针只是用于stackoverflow的一个示例,而不是在真正的代码中,对象更合适吗?@TristramGräbener:如果Level
真的很大,那么它可能不仅仅是为了StackOverflow(站点)而堆积,而是为了防止堆栈溢出(错误)。拥有真正巨大的对象是相当困难的(使用数组除外,我不鼓励使用向量)。他取消了级别的引用,将其传递给代理的构造函数,所以我不认为它的大小是一个真正的问题(当然,它可能会作为引用传递…谁知道呢)我不明白,创建一个新级别并使用指针引用它有什么问题?我如何修改它,为每个插槽创建一个新的级别?你是什么意思?如果你想避免复制,你可以使用指针,但是你必须担心内存管理。我如何修改它,为每个插槽创建新的指针?你是什么意思?如果你想避免复制,你可以使用指针,但是你必须担心内存管理。什么是Agent::Agent(Agent const&)
?还是说我不是?对不起,我不太明白。@SirYakalot:我只能猜测,因为你的问题有点模糊。我假设你问是因为你的编译器告诉你没有复制构造函数<代码> STD::vector < /COD>需要一个(它使用它),如果您实现了至少一个构造函数,但没有显式实现复制构造函数,则默认复制构造函数被C++移除,导致缺少复制构造的类型,因此,无法存储在std::vector
@bitmask中:如果实现另一个构造函数,则不会删除复制构造函数(不过默认构造函数是)。什么是Agent::Agent(Agent const&)
?@SirYakalot: