C++ Float打印一个大而奇怪的值
因此,我创建了一个C++ Float打印一个大而奇怪的值,c++,pointers,cocos2d-x,C++,Pointers,Cocos2d X,因此,我创建了一个State类。在该State类的create函数中,它通过调用statevisional类的create函数来创建一个statevisional类,并将自身作为参数传递。(该参数是一个引用,因此不存在复制)。然后,statevisional将参数(状态实例)设置为其父变量,即状态类型的指针 在statevisional的create函数中,一切正常。然而,当您使用它的update方法并尝试打印它的父级大小时,它会打印一些奇怪的值 #ifndef STATE_H #define
State
类。在该State
类的create函数中,它通过调用statevisional
类的create函数来创建一个statevisional
类,并将自身作为参数传递。(该参数是一个引用,因此不存在复制)。然后,statevisional
将参数(状态实例)设置为其父变量,即状态类型的指针
在statevisional
的create函数中,一切正常。然而,当您使用它的update方法并尝试打印它的父级大小时,它会打印一些奇怪的值
#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
statevisional.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
#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;
}
#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;
}
State.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
#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;
}
#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;
}
statevisional.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
#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;
}
#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).
已创建
新国家视觉!
cocos2d:fullPathForFilename:在/cc_2x2_white_图像中找不到文件。可能的
缺少文件。
20.000000, 20.000000
母公司规模:20.000000
500.000000, 500.000000
cocos2d:QuadCommand:将索引大小从[-1]调整为[2560]
168.058044,-107374176.0000000xCCCC
,在调试构建中用于填充未初始化内存的典型值,解释为32位浮点,等于-107374176.000000
。您正在打印未初始化的浮点值
State State::create() {
State state;
state.visual = StateVisual::create(state);
cocos2d::SEL_SCHEDULE ss;
return state;
}
在该函数结束时,本地对象状态将被销毁(或移动到新对象)。这意味着任何指向地址和状态的指针在state::create
visual->parent = &parent; // parent = state object on stack
由于这一行,visual->parent
现在处于悬空状态。
这些奇怪的值是线程堆栈的随机内容
您应该为state\parent使用共享指针
void StateVisual::update(float dt) {
cocos2d::MathUtil::smooth(&_size, parent->size, dt, .2);
setSize(_size);
CCLOG("%f, %f", _size, (*this->parent).size);
为什么在函数的第一行中使用parent->size
,在第三行中使用(*此->父级).size
李>
为什么不使用getter和setter呢
为什么不显示头文件
为什么您没有准备最简单的示例(例如,没有标签、位置等的父子逻辑和大小)
这是用来做什么的?statevision*visual(newstatevision());
如果visual
是自动变量,我认为它应该看起来像lokestatevisional(new statevisional());
否则不应该是statevision*visual=new statevision(new statevision());
你确定要将new statevision对象传递给statevision的构造函数吗
size
的类型是什么?您有3个类,其中一个成员名为setSize
,而\u size
是什么?您忽略了关键信息,特别是定义具有setSize()的类的头文件
member function。如果有多个成员函数和数据成员,且名称相似,则表明您感到困惑(例如,期望一个类中的功能在另一个类中,而实际情况并非如此)。因此,我投票决定以不清楚的方式结束这个问题。你需要清理你的代码,如果你希望得到帮助,请提供答案。1.这是因为我做了不同的事情,看看哪里出了问题。2.为什么我,它会改变什么,我不知道。3.我高度怀疑这些会改变什么,特别是对于这类问题m、 似乎是一个与cpp相关的问题。4.对于我所知甚少的此类问题,我如何知道要删除和保留哪些内容?在你的第三个问题中,你想让我包括我怀疑会发生很大变化的内容,但在这里你想删除我怀疑会发生很大变化的内容并将其保持在最低限度?5.在cocos2d中,我认为这鼓励了pointers for classes你应该使用getter并在调试器的getter中添加断点,这可能会告诉你发生了什么。我不能用一个简单的赋值语句来实现这一点?据我所知,如果你是专业的h4xx0r,你可以查看反汇编以进行调试。但是你要求帮助调试,所以我分享了最佳实践。我相信调用getter方法而不是对变量赋值会触发assert,至少在调试中编译二进制代码时是这样,但这取决于编译器(我认为对悬空指针调用方法是未定义的行为)