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: