java不用析构函数,堆栈分配的类--C发生不需要的析构函数调用
在Game類函數(shù)中,我將一個Boundary類分配給堆棧
void Game::loadContent()
{
Boundary b(this, body);
}
邊界類有一個指向主Game類的指針和一個指向剛體的指針 . 我不確定我是否應(yīng)該使用每個參考?這里的一些清晰度將有助于后面解釋的原因 .
class Boundary : public DynamicEntity
{
public:
Boundary(Game *game, btRigidBody *body);
~Boundary(void);
// Override functions
virtual void draw(float dt);
virtual glm::vec3 getPosition();
virtual void update(float dt);
};
DynamicEntity類指定正文并在其析構(gòu)函數(shù)中處理指針刪除 .
class DynamicEntity : public Entity
{
public:
virtual ~DynamicEntity(void);
virtual void draw(float dt) = 0;
btRigidBody* getBody();
glm::vec3 getPosition() = 0;
virtual void update(float dt) = 0;
protected:
explicit DynamicEntity(Game *game, btRigidBody *body);
btRigidBody *m_body;
};
DynamicEntity.cpp析構(gòu)函數(shù)
DynamicEntity::~DynamicEntity(void)
{
m_game->m_dynamicsWorld->removeRigidBody(m_body);
delete m_body;
}
DynamicEntity派生自所有稱為Entity的游戲?qū)ο蟮幕?/p>
Entity.h
class Entity
{
public:
// Make destructor virtual as this is a base class
virtual ~Entity(void);
virtual void draw(float dt) = 0;
int getID();
virtual glm::vec3 getPosition() = 0;
virtual void update(float dt) = 0;
protected:
explicit Entity(Game *game); // Abstract base constructor
Game *m_game;
int m_id; // Unique ID
};
我不能在這個類的析構(gòu)函數(shù)中調(diào)用Game類指針上的delete,但這就是為什么我不確定作為指針傳遞是否是正確的方法(而不是引用)?
Entity::~Entity(void)
{
// Derived class destructors are called first
delete m_game; // ERROR
}
Entity類添加一個指向自身的指針,可以通過Game類中的列表進行訪問(對于在主Game類中迭代和調(diào)用實體函數(shù)很有用) .
Entity::Entity(Game *game)
: m_game(game), // Initialise members
m_id(m_game->g_idGenerator->generateNewID()) // Generate unique ID
{
m_game->m_entities.push_back(std::shared_ptr(this));
}
我遇到的主要問題是,一旦Game :: loadContent()方法完成,就會為Entity類調(diào)用析構(gòu)函數(shù) . 這會破壞存儲在列表中的* shared_ptr *,并在嘗試調(diào)用任何虛擬方法時發(fā)生錯誤 .
我想邊界指針一直存在,直到我說刪除 . 如果沒有將Boundary分配給堆,有沒有辦法做到這一點?
編輯
回應(yīng)使用const&Game的建議
看來我必須將我的Entity Headers 更改為以下內(nèi)容
Entity.h
#pragma once
#include
#include "Game.h"
// Forward declarations
class Game;
class Entity
{
public:
// Make destructor virtual as this is a base class
virtual ~Entity(void);
// '= 0' means pure virtual function (like 'abstract' in C#)
// This means they do not have to be declared in the source file '.cpp'
virtual void draw(float dt) = 0;
int getID();
virtual glm::vec3 getPosition() = 0;
virtual void update(float dt) = 0;
protected:
explicit Entity(const Game &game); // Abstract base constructor
Game m_game;
int m_id; // Unique ID
};
Game m_game 不是將Game類的實例分配給堆棧嗎?如果要表示引用,應(yīng)如何在 Headers 中聲明?
編輯2
如果我在基礎(chǔ)實體類 const Game &m_game 中存儲對Game類的受保護引用,我似乎無法在派生類中訪問Game類 g_wireShapeDrawer 的全局成員 .
class Game
{
public:
GL_WireShapeDrawer g_wireShapeDrawer;
Game(void);
~Game(void);
void init();
void draw(float dt);
void handleInput(float dt);
void loadContent();
void update(float dt);
};
例如,我在嘗試訪問派生的Boundary類源的draw方法中的全局成員時遇到以下錯誤
void Boundary::draw(float dt)
{
m_game.g_wireShapeDrawer.drawPlane(glm::vec3(0, 1, 0), 0.0f, glm::vec4(1, 1, 1, 1));
}
錯誤C2662:'GL_WireShapeDrawer :: drawPlane':無法將'this'指針從'const GL_WireShapeDrawer'轉(zhuǎn)換為'GL_WireShapeDrawer&
為什么是這樣?
總結(jié)
以上是生活随笔為你收集整理的java不用析构函数,堆栈分配的类--C发生不需要的析构函数调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪个网站买手机便宜
- 下一篇: 大疆 Mini 2 SE 无人机发布:飞