浮子打印出巨大的怪异价值

Float prints a large, weird value

本文关键字:巨大 打印      更新时间:2023-10-16

所以,我创建了一个State类。在State类的创建函数中,它通过调用StateVisual类的创建函数来创建StateVisual类,并将其自身传递为参数。(参数是参考,因此没有复制)。然后,StateVisual设置参数(State实例),因为它的父变量是状态类型的指针。

StateVisual的创建功能中,一切正常。但是,当您进入它的更新方法并尝试打印其父尺寸时,它会打印一些怪异的值。

#ifndef STATE_H
#define STATE_H
#include "cocos2d.h"
class StateVisual;

class State {
public:
    State();
    ~State();
    static State create();
    StateVisual *visual;
    float size;
    void setSize(float);
    void update(float);
private:
    cocos2d::Scheduler* _scheduler;

};
#endif

StateVisual.cpp

#ifndef STATE_VIS_H
#define STATE_VIS_H

#include "cocos2d.h"
#include "State.h"

class StateVisual : public cocos2d::Sprite {
public:
    StateVisual();
    ~StateVisual();
    // create a visual
    State* parent;
    static StateVisual* create(State& parent);
    cocos2d::Label* label;
    void setSize(float);
    void update(float);


private:
    bool _activated;
    float _size;

};
#endif

State.cpp

#include "State.h"
#include "GameScene.h"

State::State() : size(0) {
    CCLOG("Created");
}
State::~State() {
}
void State::setSize(float newSize) {
    size = newSize;
    CCLOG("%f, %f", newSize, size);
}
void State::update(float dt) {
}
State State::create() {
    State state;
    state.visual = StateVisual::create(state);
    cocos2d::SEL_SCHEDULE ss;
    return state;
}

StateVisual.cpp

#include "StateVisual.h"
#include "GameScene.h"
using namespace cocos2d;

StateVisual::StateVisual() : parent(nullptr) {
    CCLOG("New STATE VISUAL!");
}
StateVisual::~StateVisual() {
}
void StateVisual::setSize(float size) {
    setContentSize(Size(size, size));
    if (size > 30) {
        label->setSystemFontSize(size*.1);
        label->setOpacity(255);
    }
    else {
        label->setOpacity(0);
    }
}
void StateVisual::update(float dt) {
    cocos2d::MathUtil::smooth(&_size, parent->size, dt, .2);
    setSize(_size);
    CCLOG("%f, %f", _size, (*this->parent).size);
}
StateVisual* StateVisual::create(State &parent) {
    StateVisual* visual(new StateVisual());
    if (visual->initWithFile("Circle.png"))
    {
        visual->setSize(200);
        visual->_size = 200;
        visual->parent = &parent;
        visual->parent->setSize(20);
        CCLOG("PARENT SIZE: %f", visual->parent->size);
        visual->autorelease();
        visual->scheduleUpdate();
        return visual;
    }
    CC_SAFE_DELETE(visual);
    return NULL;
}

它输出:

Created
New STATE VISUAL!
cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible 
missing file.
20.000000, 20.000000
PARENT SIZE: 20.000000
500.000000, 500.000000
cocos2d: QuadCommand: resizing index size from [-1] to [2560]
168.058044, -107374176.000000  <-- Those are the weird values it prints
155.130508, -107374176.000000
The program '[1464] State.exe' has exited with code 0 (0x0).

0xCCCCCCCC是一种典型的值,用于填充调试构建中的非初始化内存,被解释为32位浮点,等于 -107374176.000000。您正在打印一个非初始化的float值。

State State::create() {
    State state;
    state.visual = StateVisual::create(state);
    cocos2d::SEL_SCHEDULE ss;
    return state;
}

在此函数的末尾,局部对象状态被摧毁了制造的副本OI(或移至新对象)。这意味着在State::create

结束后,任何指向地址的指针都是无效的
visual->parent = &parent; // parent = state object on stack

因为这条线visual->parent现在正在悬空。那些怪异的值是您线程堆栈的随机内容...

您应该做的是为状态 parent使用共享指针。

void StateVisual::update(float dt) {
cocos2d::MathUtil::smooth(&_size, parent->size, dt, .2);
setSize(_size);
CCLOG("%f, %f", _size, (*this->parent).size);
  1. 为什么在1行函数中使用parent->size,而(*this->parent).size则在第三行中使用?
  2. 您为什么不使用Getters和Setter?
  3. 为什么不显示标头文件?
  4. 您为什么不准备最小的示例(例如,只有父子逻辑和大小没有标签,位置等。?
  5. 这是什么做的?StateVisual* visual(new StateVisual());如果visual是自动变量,我认为它应该看起来LOKE StateVisual visual(new StateVisual());否则应该是StateVisual* visual = new StateVisual(new StateVisual());您还确定要将新的状态视图传递到状态视图的构造函数吗?