es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En C++, ¿cómo puedo arreglar que la variable de una clase de puntero se convierta en un nullptr al llamarla?

Quiero utilizar una clase: class2, dentro de una clase: class1. De lo que he leído, para prevenir una dependencia circular, hay que declarar forward class2 en class1.h y que sea un puntero. Después de llamar una función de class2 en mi archivo class1.cpp. No puedo llamar las variables dentro de la class2 sin obtener “Unable to read memory” o un nullptr.

Aquí está mi código, gracias por la ayuda:

//main.cpp

#include “Login.h”

#include

using namespace std;

int main() {
Login login;

login.StartMenu();
cout << "ENDING" << endl;

system("pause");
return 0;

}

//Login.h (Class1)

#pragma once

#include

using namespace std;

class GameManager;

class Login {
public:
void StartMenu();

private:
GameManager* manager;

};

//Login.cpp

#include “Login.h”
#include “GameManager.h”

void Login::StartMenu() {
manager->GameStart();

}

//GameManager.h (Class2)

#pragma once

class GameManager {
public:
void GameStart();

private:
int level = 1;

};

//GameManager.cpp

#include “Login.h”
#include “GameManager.h”

void GameManager::GameStart() {
cout << level;

}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basándome en tu código, parece que has declarado correctamente la clase GameManager en Login.h para evitar una dependencia circular. Sin embargo, en tu archivo Login.cpp, estás tratando de llamar a una función de la clase GameManager sin inicializar realmente el puntero GameManager en tu clase Login. Esto probablemente está causando el error “No se puede leer memoria” que ves.

    Para solucionarlo, debes agregar una línea en el constructor de Login para inicializar el puntero manager y apuntarlo a una nueva instancia de GameManager:

    Login::Login() {
      manager = new GameManager();
    }
    

    Luego, en el destructor de Login, asegúrate de eliminar el objeto GameManager para evitar fugas de memoria:

    Login::~Login() {
      delete manager;
    }
    

    Con estos cambios, tu archivo Login.cpp debería verse así:

    #include "Login.h"
    #include "GameManager.h"
    
    Login::Login() {
      manager = new GameManager();
    }
    
    Login::~Login() {
      delete manager;
    }
    
    void Login::StartMenu() {
      manager->GameStart();
    }
    

    Esto te permitirá llamar la función GameStart de la clase GameManager y acceder a sus variables sin problemas. ¡Avísame si tienes alguna pregunta o problema adicional!

Comments are closed.