在类中定义公共结构

时间:2011-06-19 08:54:40

标签: c++ class constructor struct

嘿所以我正在制作一个功能,收集你想保留在屏幕上的精灵,以及
 然后“检查()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?

3 个答案:

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

<强>除了

重新添加问题 - 答案很简单:将其定义为privateprotected(如果您希望将来继续使用继承)。通过这种方式 - OnScreenCheck之外的任何代码都无法访问它。

答案 2 :(得分:1)

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

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

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