определение публичной структуры внутри класса - PullRequest
2 голосов
/ 19 июня 2011

Эй, я делаю функцию, которая собирает спрайты, которые вы хотите сохранить на экране, и
затем "Check () s" их, чтобы убедиться, что они остаются, в противном случае они отскакивают от края экрана.

Я определил структуру внутри своего класса ('Object'), которая содержит ссылку на спрайт и независимо от того, находится ли она вне экрана или нет.
(поэтому функция рефлекса () больше не вызывается до того, как спрайт фактически возвращается в экран)

У меня есть три вопроса относительно следующего кода:

  • Позволит ли сохранение ссылки на спрайт в моей структуре Object позволить мне получить исходный спрайт, а не просто копию при вызове refle ()?

  • Почему структура 'Object' подчеркнута красным, говоря: Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.

  • В конструкторе я создаю экземпляр объекта и передаю его в вектор объектов. Я бы подумал, что, поскольку я передаю его вектору, вектор сделал бы его копию и сохранил, но мне также интересно, будет ли экземпляр уничтожен после того, как Конструкторы закончили, что-то напортачило. Будет ли это работать?

Спасибо за любую помощь! Вот Функтор:

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: Кроме того, мои намерения с struct Object состоят не в том, чтобы иметь публичный тип данных, принадлежащий OnScreenCheck, а в том, чтобы сделать тип данных доступным только для OnScreenCheck, поскольку он сохраняет эти «объекты» в векторные объекты. Он просто предназначен для организации данных в OnScreenCheck. Как я могу сделать это так, и мне не нужно инициализировать объект прямо в конструкторе OnScreenCheck?

Ответы [ 3 ]

2 голосов
/ 19 июня 2011

Позволит ли сохранение ссылки на спрайт в моей структуре Object позволить мне достичь исходного спрайта, а не просто копии при вызове refle ()?

Ссылки должны быть инициализированы во время создания, и они остаются привязанными к объекту типа, к которому они относятся, так что Сохранение ссылки на sprite всегда будет указывать на один и тот же объект sprite, любая попытка сделать это псевдоним к чему-то другому приведет к ошибке.

Почему структура "Объект" подчеркнута красным, говоря: Error: implicitly generated constructor for class "OnScreenCheck::Object" cannot initialize.

Вам необходимо предоставить конструктор для OnScreenCheck, который будет соответствующим образом инициализировать Object элемент, особенно ссылочный элемент для sprite. Ошибка, в частности, потому что ссылки ДОЛЖНЫ быть инициализированы во время создания.

В конструкторе я создаю экземпляр объекта и передаю его в вектор объектов. Я бы подумал, что, поскольку я передаю его вектору, вектор сделал бы его копию и сохранил, но мне также интересно, будет ли экземпляр уничтожен после того, как Конструкторы закончили, что-то напортачило. Будет ли это работать?

Вектор сохранит копию объекта и не будет уничтожен, если вы явно не попросите вектор сделать это с помощью векторных функций, если, конечно, ваш объект не имеет несколько типов указателей.

2 голосов
/ 19 июня 2011

По умолчанию ошибка конструктора:

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 не сможет получить к нему доступ.

1 голос
/ 19 июня 2011

Ссылка будет действительна до тех пор, пока исходный объект остается живым (и не удаляется).

Object не может быть создан по умолчанию, потому что ссылка должна быть инициализирована при создании. Присвоение ссылки не изменяет ссылку, но объект, на который она ссылается.

Сохранение копии в векторе и уничтожение оригинала выглядит нормально. Возможно, вам нужен только один объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...