我正在研究一个正在进行的c ++类的项目,我无法弄清楚一些编译器错误。我的文件应该写一个基类精灵,它具有多态函数绘制,其他4个类继承。但是我无法弄清楚这些编译器问题!
main.cpp:在函数中?main()â€:
main.cpp:72:47:警告:扩展初始化列表仅可用 -std = c ++ 0x或-std = gnu ++ 0x [默认启用]
main.cpp:72:47:错误:从初始化列表
分配给数组main.cpp:73:23:错误:在'之前预期的primary-expression) 令牌
main.cpp:74:21:错误:在'之前预期的primary-expression) 令牌
main.cpp:75:22:错误:在'之前预期的primary-expression) 令牌
main.cpp:76:20:错误:在'之前预期的primary-expression) 令牌
main.cpp:81:13:警告:删除数组--Sprite数组[4]†[默认启用]
这是我的代码!
#include "drawing.h"
class Sprite
{
friend class Shadow;
friend class Speedy;
friend class Bashful;
friend class Pokey;
private:
int row;
int col;
public:
int getCol()
{
return col;
}
int getRow()
{
return row;
}
void setPosition(int x, int y)
{
row = x;
col = y;
}
virtual void draw()
{
drawErrorMessage(row, col);
}
};
class Shadow: public Sprite
{
public:
virtual void draw()
{
drawShadow(row,col);
}
};
class Speedy: public Sprite
{
public:
virtual void draw()
{
drawSpeedy(row,col);
}
};
class Bashful: public Sprite
{
public:
virtual void draw()
{
drawBashful(row,col);
}
};
class Pokey: public Sprite
{
public:
virtual void draw()
{
drawPokey(row,col);
}
};
int main()
{
Sprite array[4];
beginDrawing();
array = {Shadow(),Speedy(),Bashful(),Pokey()};
((Shadow) (array[0]*)).setPosition(5,10);
((Speedy)(array[1]*)).setPosition(5,44);
((Bashful)(array[2]*)).setPosition(22,44);
((Pokey)(array[3]*)).setPosition(22,10);
array[0].draw();
array[1].draw();
array[2].draw();
array[3].draw();
delete [] array;
endDrawing();
}
答案 0 :(得分:1)
您正在做的事情存在各种问题:
1)您正在尝试将初始化列表分配给数组:
array = {Shadow(),Speedy(),Bashful(),Pokey()};
这是有效的C ++ 11,但不是有效的C ++ 98。
2)即使您使用的是C ++ 11,这也是一件不幸的事情,因为将Shadow
分配给Sprite
会导致切片(Sprite
子 - Shadow
的对象将被分配,但Shadow
的其余部分将不会被分配。有关其他示例,请参阅What is object slicing?。
3)你正在尝试delete[]
堆栈分配的数组:
Sprite array[4];
//...
delete [] array;
一般情况下,只能在delete[]
的内容上致电new[]
。简单(不相关)的例子:
int *arr = new int[4];
delete [] arr;
在这个问题的上下文中,你要分配数组的元素,而不是数组本身,而是你需要删除的那些(使用delete
和不是 delete[]
,因为它们已分配new
而非new[]
)。
4)您正在尝试对动态类型为Sprite
的对象进行多态调用。数组的每个元素都是Sprite
。您可能意味着拥有一个Sprite*
数组,然后每个元素可以指向Shadow
或Speedy
,或者......此时,动态类型为指向的对象将是Shadow
,Speedy
等,并且进行array[i]->draw()
等多态调用将是有意义的。
5)此语法无效:
((Shadow) (array[0]*)).setPosition(5,10);
我假设你正在尝试(根据下面的指针数组思考)做类似的事情:
(*static_cast<Shadow*>(array[0])).setPosition(5,10);
实际上你几乎肯定只想要:
array[0]->setPosition(5,10);
一般来说,你的代码并没有做正确的事情。你可能想要更像这样的东西:
class Sprite
{
private:
int col, row;
public:
virtual ~Sprite() {}
virtual void draw()
{
drawErrorMessage(row, col);
}
int getCol() const
{
return col;
}
int getRow() const
{
return row;
}
void setPosition(int row_, int col_)
{
row = row_;
col = col_;
}
};
class Shadow : public Sprite
{
public:
/*virtual*/ void draw()
{
drawShadow(row, col);
}
};
// etc.
int main()
{
const int SPRITE_COUNT = 4;
Sprite *array[SPRITE_COUNT];
array[0] = new Shadow;
array[0]->setPosition(5, 10);
// etc.
beginDrawing();
for(int i = 0; i < spriteCount; ++i)
{
array[i]->draw();
delete array[i]; // note: polymorphic deletion, hence the need for a virtual destructor
}
endDrawing();
return 0;
}