Я не могу присвоить объект массиву объектов - PullRequest
0 голосов
/ 03 ноября 2019

Я только что написал свой первый конструктор копирования и оператор копирования, и я пытаюсь присвоить экземпляр объекта массиву следующим образом:

Agent agent = Agent(navmesh, rb, m_maxPathSize);
Agent tmp = agent; // DEBUG
m_agents[idx] = agent;

Кажется, что конструктор копирования работает нормально, так как tmp является идеальной копией agent (с новым назначенным указателем m_path). Но когда я присваиваю agent m_agents[idx], последний состоит из того, что я ожидал от конструктора по умолчанию (m_path == 0, m_alive == false).

Мои конструкторы выглядят так:

Agent() { m_path = 0; m_alive = false; };
Agent::Agent(NavMeshNavigator* navmesh, RigidBody* rb, int maxPathSize)
    : m_rb(rb), m_navmesh(navmesh), m_maxPathCount(maxPathSize)
{
    m_path = new float3[maxPathSize];
};
Agent::Agent(const Agent &a)
{
    memcpy(this, &a, sizeof(Agent));
    if (m_path)
    {
        float3* oldptr = m_path;
        m_path = new float3[m_maxPathCount];
        memcpy(m_path, oldptr, m_maxPathCount * sizeof(float3));
    }
}
Agent& Agent::operator=(const Agent &a) { return Agent(a); }
Agent::~Agent() { if (m_path) delete[] m_path; };

...

protected:
   float3* m_path;
   bool m_alive = true;

Конструктор выделяет память для m_path, используя new[], деструктор освобождает ее с помощью delete[], оператор копирования вызывает конструктор копирования, а конструктор копирования сначала копирует оригинал перед выделением нового m_path array.

В моем тестовом примере idx == 0, так что этого не может быть. Первоначально я использовал malloc вместо new[], но получил те же результаты. Я бы сказал, что проблема в конструкторе / операторе копирования, поскольку у меня нет с этим опыта, но тогда почему он отлично работает с tmp?

РЕДАКТИРОВАТЬ: массив m_agents объявляется и уничтожается следующим образом:

NavMeshAgents(int maxAgents, int maxAgentPathSize)
        : m_maxAgents(maxAgents), m_maxPathSize(maxAgentPathSize)
    {
        m_agents = new Agent[maxAgents];
    };
    ~NavMeshAgents() { if (m_agents) delete[] m_agents; m_agents = 0; };

1 Ответ

0 голосов
/ 03 ноября 2019

Как объясняют @Evg @HolyBlackCat и @ Adrian-Reinstate-Monica в комментариях, new[] вызывает конструктор по умолчанию для всех его членов. Agent tmp = agent вызывает конструктор копирования, тогда как tmp = agent вызвал бы оператор присваивания (tmp.operator=(agent)). Мой оператор присваивания был неверным, он должен инициализировать this (а затем вернуть *this, а не возвращать экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...