где в этом коде я вызываю конструктор копирования? - PullRequest
1 голос
/ 06 декабря 2011

в ответе на этот вопрос Мне сообщили, что мои проблемы связаны с вызовом конструктора копирования в приведенном ниже коде. Тем не менее, я просто не вижу, где это вызывается. Нигде я не делаю что-то вроде 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;

}

Ответы [ 4 ]

6 голосов
/ 06 декабря 2011

Как уже говорили другие, 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, потому что вы передаете его временно.

2 голосов
/ 06 декабря 2011

Здесь:

agents.push_back(Agent(100, *level, agents, level->Pickups(), D3DXCOLOR(1.0F, 0.4f, 0.4f, 1.0f)));

Это создает временный объект Agent, и его копия помещается в vector.

.
0 голосов
/ 06 декабря 2011

Ваш std::vector::push_back имеет семантику копирования.Он должен вызывать Agent::Agent(Agent const&).

Вы не можете использовать std::vector с чем-то, что не имеет значимого конструктора копирования.Возможно, вам придется прибегнуть к вектору указателей (которые имеют тривиальные конструкторы копирования).

0 голосов
/ 06 декабря 2011

в строке ниже вы создаете временного агента и копируете его в нового агента, который создается внутри агентов, передавая временного агента.

agents.push_back (Agent (100, * level, агенты), уровень-> Датчики (), D3DXCOLOR (1.0F, 0.4f, 0.4f, 1.0f)));

...