在类中定义公共结构

defining a public struct inside a class

本文关键字:结构 定义      更新时间:2023-10-16

嘿,我正在制作一个函数,用于收集您想要保留在屏幕上的精灵,并且
然后"Check()s"使它们停留,否则使它们在屏幕边缘反弹。

我在类("Object")中定义了一个结构,它包含对精灵的引用,以及它是否仍在屏幕外
(因此,在精灵实际返回到屏幕内部之前,reflect()函数不会再次调用)

关于以下代码,我有三个问题:

  • 在Object结构中保存对精灵的引用是否允许我在调用reflect()时访问原始精灵,而不仅仅是副本?

  • 为什么"Object"结构用红色下划线,表示Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.

  • 在构造函数中,我创建一个Object实例,并将其传递到Objects向量中。我想,既然我把它传递给向量,向量就会复制并保存它,但我也在想,在构造函数完成后,实例是否会被破坏,搞砸了什么。它行得通吗?

感谢您的帮助!这是函数:

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);}
            }
        }
    };

EDIT:此外,我对structObject的意图不是拥有属于OnScreenCheck的公共数据类型,而是使数据类型只能由OnScreenCheck使用,因为它将这些"对象"保存到矢量对象中。它只是用来组织OnScreenCheck中的数据。我怎么能这样做,这样我就不必在OnScreenCheck构造函数中立即初始化对象了?

在Object结构中保存对精灵的引用是否允许我在调用reflect()时访问原始精灵,而不仅仅是副本

引用需要在创建时初始化,并且它们仍然绑定到它们别名的类型对象。因此,保存对sprite的引用将始终指向同一个sprite对象,任何使其别名为其他对象的尝试都将导致错误。

为什么"Object"结构用红色下划线,表示Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.

您需要为OnScreenCheck提供一个构造函数,该构造函数将适当地初始化Object成员,尤其是sprite的引用成员。该错误特别是因为引用必须在创建时初始化。

在构造函数中,我创建一个Object实例,并将其传递到Objects向量中。我想,既然我把它传递给向量,向量就会复制并保存它,但我也在想,在构造函数完成后,实例是否会被破坏,搞砸了什么。它行得通吗

向量将保存对象的副本,并且不会被销毁,除非您通过向量函数明确要求向量这样做,当然,除非您的对象有一些指针类型。

关于默认构造函数失败:

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);
};

添加

关于问题的补充——答案很简单:将其定义为privateprotected(以备将来使用继承)。通过这种方式-OnScreenCheck之外的任何代码都无法访问它。

只要原始对象保持活动状态(并且不会移动),引用就会有效。

Object不能默认构造,因为创建引用时必须初始化。分配给引用不会更改引用,但会更改引用所指的对象。

将副本存储在矢量中并销毁原始副本似乎没问题。你可能只想要一个对象。