[英]I can't assign an object to an object array
我剛剛編寫了我的第一個復制構造函數和復制運算符,我正在嘗試將一個 object 實例分配給一個數組,如下所示:
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;
構造函數使用new[]
為m_path
分配 memory ,析構函數使用delete[]
釋放它,復制運算符調用復制構造函數,並且復制構造函數在分配新的m_path
數組之前首先復制原始文件。
在我的測試用例中, 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; };
正如@Evg @HolyBlackCat 和@Adrian-Reinstate-Monica 在評論中解釋的那樣, new[]
為其所有成員調用默認構造函數。 Agent tmp = agent
調用復制構造函數,而tmp = agent
將調用賦值運算符( tmp.operator=(agent)
)。 我的賦值運算符錯了,它應該初始化this
(然后返回*this
而不是返回一個實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.