我无法将对象分配给对象数组
I can't assign an object to an object array
我刚刚编写了我的第一个复制构造函数和复制运算符,我正试图将一个对象实例分配给一个数组,如下所示:
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
分配内存,析构函数使用delete[]
释放内存,复制运算符调用复制构造函数,复制构造函数在分配新的m_path
数组之前首先对原始数组进行memcopy。
在我的测试用例中,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
,而不是返回实例。
相关文章:
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 为对象分配整数.输出将是什么?
- C++ 使用枚举类对象分配 std::map 值
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 是否可以使用 malloc 为类对象分配内存?
- 将对象分配给数组C++
- 我们可以在cpp中为对象分配函数吗
- 为模板参数类型中的新对象分配内存
- 我无法将对象分配给对象数组
- 对象分配-成员函数的使用无效错误
- 将派生对象分配给函数内的基类指针
- Arduino ESP32如何将BLEUUID对象分配到字符串中
- Rapidjson将密钥值从一个文档对象分配到另一个文档对象
- 奇怪的对象分配行为C