我需要一个 DizzyCreature 类型(我的类)的双指针来指向 DizzyCreature 指针数组。当我运行它时,我得到“访问冲突读取位置 0x...”。我可以创建一个 DizzyCreature* 并调用它的成员函数,但是当无法运行数组并对每个 obj 执行相同的操作时。
我正在遵循以下说明: http://www.cplusplus.com/forum/beginner/10377/
代码
服务器.h:
class Server
{
public:
Server(int x, int y, int count);
~Server(void);
void tick();
private:
DizzyCreature** dcArrPtr;
DizzyCreature* dcPtr;
int _count;
};
服务器.cpp:
Server::Server(int x, int y, int count)
{
dcPtr = new DizzyCreature[count]; // this works just fine
dcArrPtr = new DizzyCreature*[count]; // this doesn't (but gets past this line)
_count = count;
}
Server::~Server(void)
{
delete[] *dcArrPtr;
delete[] dcPtr;
}
void Server::tick()
{
dcPtr->takeTurn(); // just fine
for (int i = 0; i < _count; i++) {
dcArrPtr[i]->takeTurn(); // crash and burn
}
}
编辑: 成员函数takeTurn()位于DizzyCreature的父类中。程序将其放入函数中,但是一旦它尝试更改私有(private)成员变量,就会抛出异常。如果重要的话,DizzyCreature 属于 GameCreature 和 WhirlyB 类型,因为这是 MI 上的作业。
最佳答案
您已经为dcArrPtr
分配了空间,但没有分配该数组中的每个对象。您必须执行以下操作:
Server::Server(int x, int y, int count)
{
dcPtr = new DizzyCreature[count];
dcArrPtr = new DizzyCreature*[count];
for ( int i = 0; i < count; i++ ) {
dcArrPtr[ i ] = new DizzyCreature;
}
_count = count;
}
Server::~Server(void)
{
for ( int i = 0; i < count; i++ ) {
delete dcArrPtr[ i ];
}
delete[] *dcArrPtr;
delete[] dcPtr;
}
关于c++ - 动态分配对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9503718/