从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
A class derived from Cocos2d::Layer has a Pointer Data Member. This member also has vector container. When vector::push_back is called it crashes
我尽了最大的努力编辑了这篇文章。希望它现在是最小的,完整的,可验证的示例
- 我使用Cocos2dx V3.6为我们目前的游戏
- 我所描述的问题只发生在cocos2d::Layer 的自定义派生类中
- cocos2dx使用静态创建函数,用于模仿ObjC版本的自动发布功能。在这个create函数中调用虚拟init()方法和构造函数。它是通过使用CREATE_FUNC宏生成的。
问题正如标题所描述的那样。我有一个来自cocos2d::Layer (GameWorldLayer)的自定义派生类。它有一个指针数据成员(m_bar)。M_bar也有一个std:vector属性(m_container)。我在GameWorldLayer的重写虚拟init()中初始化m_bar。因此,每当我尝试将某些东西推入m_container vector时,我都会得到EXP_BAD_ACCESS。
如果我在虚拟init()方法之外初始化指针数据成员(m_bar),那么一切都可以正常工作。
简单来说,我只是不明白为什么在虚拟init()方法之外初始化指针数据成员会工作,但在内部初始化时却完全失败。
我试图简化代码,并保持在最低限度,如果你尝试在你的IDE(我使用xcode btw)你应该得到相同的EXP_BAD_ACCESS我不断得到。(我相信你已经知道了,但你还需要cocos2dx 3.6)
GameWorldLayer.h
#ifndef __Flide__GameWorldLayer__
#define __Flide__GameWorldLayer__
#include "cocos2d.h"
#include "bar.h"
class GameWorldLayer : public cocos2d::Layer
{
private:
Bar * m_bar;
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(GameWorldLayer);
void AddSomethingToBar();
~GameWorldLayer();//destructor
};
GameWorldLayer.cpp
#include "GameWorldLayer.h"
GameWorldLayer::~GameWorldLayer()
{
delete m_bar;
}
cocos2d::Scene* GameWorldLayer::createScene()
{
// 'scene' is an autorelease object
auto scene = cocos2d::Scene::create();
// 'layer' is an autorelease object
auto layer = GameWorldLayer::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
bool GameWorldLayer::init()
{
//1. super init first
if ( !Layer::init())
{
return false;
}
m_bar = new Bar();
return true;
}
void GameWorldLayer::AddSomethingToBar()
{
m_bar->PushContainer();
}
Bar.h
#ifndef __Flide__bar__
#define __Flide__bar__
#include <vector>
#include <stdio.h>
using namespace cocos2d;
class Bar
{
private:
std::vector<int> m_container;
public:
Bar(); //constructor
~Bar();//destructor
void PushContainer(); //pushes something into m_container.
};
#endif /* defined(__Flide__bar__) */
Bar.cpp
#include "bar.h"
Bar::Bar()
{
}
Bar::~Bar()
{
m_container.clear();
}
void Bar::PushContainer()
{
m_container.push_back(1);//pushing an integer
}
我不认为这是必要的,只是为了完整。我初始化GameWorldLayer,然后在AppDelegate::applicationDidFinishLaunching()中调用GameWorldLayer::AddSomethingToBar()。
bool AppDelegate::applicationDidFinishLaunching()
{
...
// create a scene. it's an autorelease object
auto scene = GameWorldLayer::createScene();
((GameWorldLayer*)scene)->AddSomethingToBar();
...
}
我的钱在GameWorldLayer::init()
上,它不像你想象的那样被称为。m_pBar
将属于您在这里创建的层:auto layer = GameWorldLayer::create();
,而不属于您返回的Scene
对象。
因此你的Scene
对象不会访问m_pBar
,因为m_pBar
不存在于cocos2d::Scene
中。在这种情况下,强制转换也不会有任何好处。
同样,这个强制转换(((GameWorldLayer*)scene)
)是不好的。您至少应该使用dynamic_cast
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- c++ 在类中声明私有的向量,但有一个 get 函数
- 是否可以有一个模板函数,可以将向量和非向量类型都作为参数
- 为什么只有在向量中已经有一个元素时才调用移动构造函数?
- 我可以有一个与另一个向量共享存储的向量
- 我有一个问题,创建了C 中阻塞队列的向量
- 我有不同的类,我想用这些类中的对象制作一个向量,然后按值对其进行排序
- C++中的特征库有一个动态向量或矩阵吗
- 如果我有一个向量(或类似的东西)成员变量,那么move构造函数看起来怎么样
- 有没有一个函数可以计算一个向量中所有的正数
- C++是否有任何方法可以将一组派生类存储在基类的一个向量中,并仍然访问它们的成员
- C++ 有没有办法循环遍历一个向量,只有在完全搜索后才返回一条消息
- 我可以在对象中有一个指针向量 *** p 吗?
- 是否有一个 c++ 矩阵库,我可以在其中索引具有非连续向量的矩阵,如 R 中的矩阵
- 我们有一个向量,但不清楚调用了哪个构造函数
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 是否有一个向量可以处理非标准位长度的整数