嘿所以我正在制作一个功能,收集你想保留在屏幕上的精灵,以及
然后“检查()s”他们使他们保持舒适,使他们反弹屏幕的边缘否则。
我已经在我的类('Object')中定义了一个结构,该结构保存了对sprite的参考,以及它是否仍然在屏幕之外。
(因为在精灵实际返回到屏幕内部之前不会再次调用reflect()函数)
关于以下代码我有三个问题:
在我的Object结构中保存对sprite的引用是否允许我到达原始sprite,而不只是调用reflect()时的副本?
为什么“对象”结构用红色加下划线,说Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.
在构造函数中,我创建一个Object实例,并将其传递给Objects向量。我会想,因为我将它传递给向量,向量将复制它并保存它,但我也想知道在构造函数完成后是否会破坏实例,搞砸了一些东西。它会起作用吗?
感谢您的帮助!这是Functor:
class OnScreenCheck
{
public:
struct Object{
mySprite& Sprite;
bool OffScreen;};
void AddObject(mySprite& aSprite){
Object newObject;
newObject.Sprite= aSprite;
newObject.OffScreen= false;
Objects.push_back(newObject);
};
void Check(){
// make sure box1 stays on the screen
for(int I=0; I< Objects.size(); I++){
//sprite has gone to high or to low
bool yColl (Objects[I].Sprite.Side(mySprite::top)>=ScreenHeight
|| Objects[I].Sprite.Side(mySprite::bottom)<=0);
//sprite has gone to far left or right
bool xColl (Objects[I].Sprite.Side(mySprite::left)<=0
|| Objects[I].Sprite.Side(mySprite::right)>ScreenWidth);
if(Objects[I].OffScreen==false){
if(yColl){
Objects[I].OffScreen= true;
Objects[I].Sprite.Reflect(180);}
if(xColl){
Objects[I].OffScreen= true;
Objects[I].Sprite.Reflect(90);}
}
}
};
编辑:另外,我对struct Object的意图不是拥有属于OnScreenCheck的公共数据类型,而是使数据类型只能由OnScreenCheck使用,因为它保存了这些“对象”进入矢量对象。它只是用于组织OnScreenCheck中的数据。我怎么能这样做,所以我不必在OnScreenCheck构造函数中正确初始化一个Object?
答案 0 :(得分:2)
在我的Object结构中保存对精灵的参考是否允许我到达原始精灵,而不是仅仅在调用reflect()时复制?
引用需要在创建时初始化,并且它们仍然绑定到它们所属的类型对象所以保存对sprite
的引用将始终指向同一个sprite
对象,任何尝试将别名变为别名会导致错误。
为什么“对象”结构用红色下划线,表示Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.
您需要为OnScreenCheck
提供一个构造函数,该构造函数将适当地初始化Object
成员,尤其是sprite
的引用成员。该错误特别是因为引用必须在创建时初始化。
在构造函数中,我创建一个Object实例,并将其传递给Objects向量。我会想,因为我将它传递给向量,向量将复制它并保存它,但我也想知道在构造函数完成后是否会破坏实例,搞砸了一些东西。它会起作用吗?
该向量将保存对象的副本,除非您通过向量函数明确要求向量执行此操作,否则不会销毁该对象,除非您的对象具有某些指针类型。
答案 1 :(得分:2)
恢复默认构造函数失败:
struct Object{
mySprite& Sprite;
bool OffScreen;};
默认构建时 - 您期望Sprite
具有什么价值?它是一个引用,它必须引用一个现有的对象,但默认情况下没有。这就是错误的原因。
所以你可以这样做:
class OnScreenCheck
{
public:
struct Object{
Object(mySprite& aSprite, bool screen) : Sprite(aSprite), OffScreen(screen) {};
mySprite& Sprite;
bool OffScreen;};
void AddObject(mySprite& aSprite){
Object newObject(aSprite, false);
Objects.push_back(newObject);
};
<强>除了强>
重新添加问题 - 答案很简单:将其定义为private
或protected
(如果您希望将来继续使用继承)。通过这种方式 - OnScreenCheck
之外的任何代码都无法访问它。
答案 2 :(得分:1)
只要原始对象保持活动状态(并且不会移开),引用就会有效。
Object
不能默认构造,因为必须在创建时初始化引用。分配给引用不会更改引用,而是更改引用的对象。
将副本存储在矢量中并销毁原始文件似乎没问题。你可能只想要一个物体。