gpt4 book ai didi

C++成员变量在构造函数后丢失值

转载 作者:行者123 更新时间:2023-11-30 00:51:20 25 4
gpt4 key购买 nike

我在我的一门课上遇到了问题。我有这两个类,GameApp 和 Simulation:

GameApp.h

#pragma once

#include "Simulation.h"

class Simulation;

class GameApp {

static GameApp *instance;

public:

~GameApp(void);

static GameApp *initializeContext(const char *gameTitle, const int windowWidth, const int windowHeight);

//void setSimulation(Simulation &simulation) { *(this->simulation) = simulation; }
Simulation *getSimulation() { return simulation; }

static const int TARGET_FPS = 50; // Frames per second

private:

GameApp(void);
Simulation *simulation;

double frameIntervalList[TARGET_FPS]; // A list containing the time to render the last 60 frames
// Other stuff that doesn't matter

Simulation.h

#pragma once

#include <vector>
#include "GameApp.h"

class Simulation {
public:
Simulation(void);
Simulation(const Simulation &copy);
~Simulation(void);

Simulation &operator=(const Simulation &other);

protected:
std::vector<Entity*> *entities;

并且,在 GameApp.cpp 函数 initializeContext 中,我有:

#include "GameApp.h"

GameApp *GameApp::instance = NULL;

GameApp::GameApp() {
gamePaused = false;
frameIntervalSum = 0;
this->simulation = new Simulation();
for (int i = 0; i < 60; i++) {
frameIntervalList[i] = 0;
}
}

GameApp *GameApp::initializeContext(const char *gameTitle, const int windowWidth, const int windowHeight) {
instance = new GameApp();

// (...) Rest of initialize funcion
}

问题是,出于某种神秘的原因,当我调用 initializeContext 时,它的第一行调用了 GameApp 的构造函数,它创建了一个新的 Simulation,它正确分配并且我得到了一个内存地址模拟指针。但是当程序退出 GameApp 的构造函数时,在 instance = new GameApp(); 之后的行中,如果我检查新创建的 上的 simulator 变量instance 使用调试器,我得到了 0x00000000 的指针值,而我刚刚创建的 Simulation 消失了。如果我在构造函数上使用堆栈内存,确实会发生这种情况,但我想我显然是在使用 new,以正确的方式创建新的 Simulation 变量。这里可能发生了什么?

另外,GameApp.h 文件中有一个带注释的setSimulation 函数。当我不对此进行注释时,我得到编译器错误 2582,“operator= function 在 Simulation 中不可用”。这可能与我的问题有关吗?

编辑: 问题确实是硬编码大小的 for 循环。我在 header 中将 frameIntervalList 的大小从 60 更改为 50,但忘记在循环中更改它。还更新了代码以显示 frameIntervalList 的声明。

最佳答案

simulation 成员变量的初始化和 GameApp 构造器之后的代码之间执行的唯一代码是初始化 frameIntervalList< 的 for 循环 所以它的硬编码大小初始化可能会覆盖 simulation 变量的值,如果你不走运的话。 (或者幸运的是,它可以帮助您及早发现非常丑陋的错误!!!:-)

关于C++成员变量在构造函数后丢失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com