日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java不用析构函数,堆栈分配的类--C发生不需要的析构函数调用

發布時間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java不用析构函数,堆栈分配的类--C发生不需要的析构函数调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Game類函數中,我將一個Boundary類分配給堆棧

void Game::loadContent()

{

Boundary b(this, body);

}

邊界類有一個指向主Game類的指針和一個指向剛體的指針 . 我不確定我是否應該使用每個參考?這里的一些清晰度將有助于后面解釋的原因 .

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類指定正文并在其析構函數中處理指針刪除 .

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析構函數

DynamicEntity::~DynamicEntity(void)

{

m_game->m_dynamicsWorld->removeRigidBody(m_body);

delete m_body;

}

DynamicEntity派生自所有稱為Entity的游戲對象的基類

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

};

我不能在這個類的析構函數中調用Game類指針上的delete,但這就是為什么我不確定作為指針傳遞是否是正確的方法(而不是引用)?

Entity::~Entity(void)

{

// Derived class destructors are called first

delete m_game; // ERROR

}

Entity類添加一個指向自身的指針,可以通過Game類中的列表進行訪問(對于在主Game類中迭代和調用實體函數很有用) .

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類調用析構函數 . 這會破壞存儲在列表中的* shared_ptr *,并在嘗試調用任何虛擬方法時發生錯誤 .

我想邊界指針一直存在,直到我說刪除 . 如果沒有將Boundary分配給堆,有沒有辦法做到這一點?

編輯

回應使用const&Game的建議

看來我必須將我的Entity Headers 更改為以下內容

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類的實例分配給堆棧嗎?如果要表示引用,應如何在 Headers 中聲明?

編輯2

如果我在基礎實體類 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'轉換為'GL_WireShapeDrawer&

為什么是這樣?

總結

以上是生活随笔為你收集整理的java不用析构函数,堆栈分配的类--C发生不需要的析构函数调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。