Процесс C++ завершен из-за путаницы статуса 3

Я очень новичок в программировании, но я следовал учебникам по C++ и собирал несколько PDF-файлов за последнюю неделю или около того, чтобы выручить меня. Я не смог найти в них или в Интернете ничего, что бы достаточно четко ответило на мой вопрос. Пожалуйста, прости меня за мое новичок.

Соответствующий код:

Logfile.hpp

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// HEADER :: CLASS INTERFACE FILE

// ==============================
// Include Guard
#ifndef __LOGFILE_INCLUDED__ // If Actor.hpp hasn't been included yet
#define __LOGFILE_INCLUDED__ // Define this for the compiler so it knows it has now been included

// ==============================
// Forward declared dependencies

// ==============================
// Included dependencies
#include <iostream>
#include <fstream>

// ==============================
// Actual class
class Logfile { // Logfile
public:
    // Globally accessible variables
    bool LACT; // Is log file active?
    std::ofstream LOG; // Actual log file
    std::string entry; // Data to be entered in log file

    // ==============================
    // Core methods
    Logfile(); // Constructor
    ~Logfile(); // Destructor

    // Additional methods
    bool isActive(); // Is log file active?
    void logEntry(std::string entry); // Make an entry in the log if 'LACT' is set to true
    void toggleLog(); // Toggle log file open or closed
};

extern Logfile *log; // This variable is declared in main

#endif // __LOGFILE_INCLUDED__

Logfile.cpp

// ==============================
// Included dependencies
#include "Logfile.hpp"

// ==============================
// Core methods
Logfile::Logfile() { // Constructor
    LACT = true; // Toggle logfile to active
    LOG.open ("LOG.txt"); // Open 'log.txt' and prepare it to receive 'LOG' entries
    LOG << "LOG FILE CLASS CONSTRUCTED\n";
    LOG << "LOG FILE OPENED\n";
}

Logfile::~Logfile() { // Deconstructor
    LOG << "LOG FILE CLOSED\n";
    LOG << "LOG FILE CLASS DECONSTRUCTED";
    LOG.close(); // Close log file
}

// Additional methods
bool Logfile::isActive() { // Is log file active?
    if ( LACT ) return true;
    else return false;
}

void Logfile::logEntry(std::string entry) { // Make an entry in the log if 'LACT' is set to true
    if ( LACT ) LOG << entry << std::endl;
}

void Logfile::toggleLog() { // Toggle log file open or closed
    if ( LACT ) { // Log file is active
        LOG << "LOG FILE CLOSED\n";
        LOG.close(); // Close log file
    } else { // Log file is inactive
        LOG.open ("LOG.txt"); // Open 'log.txt' and prepare it to receive 'LOG' entries
        LOG << "LOG FILE OPENED\n";
    }
}

Engine.hpp

// ==============================
// Forward declared dependencies
class Logfile;

class Engine { // Core system, main loop
public :
    // Globally accessible variables 
    Logfile *log; // Declare 'log' as an empty pointer (*)

Engine.cpp

// ==============================
// Included dependencies
#include "Logfile.hpp"

// ==============================
// Core methods
Engine::Engine() { // Constructor method
    // Initialization
    log = new Logfile(); // Declare 'log' as pointer to access log file
    TCODConsole::initRoot(80,50,"Testbed",false); // Create 'root' console (not fullscreen)
    if ( log->isActive() ) log->logEntry("(TCODConsole) Root console initialized"); // WORKS

Map.hpp

// ==============================
// Forward declared dependencies
class Logfile;

extern Logfile *log; // Pointer exists in Engine.hpp

Map.cpp

// ==============================
// Included dependencies
#include "Logfile.hpp"

if ( log->isActive() ) log->logEntry("(TCODConsole) Root console initialized"); TERMINATION STATUS 3
if ( tiles[(x-1)+y*width].tType =="floor" ) tally++; // Left tile status, add 1 to tally if floor  :  TERMINATION STATUS 3
if ( tiles[(x-1)+(y-1)*width].canWalk ) tally++; // Left-top tile status, add 1 to tally if floor  :  WORKS

Если я правильно понимаю, состояние завершения 3 указывает, что я неправильно ссылаюсь на переменную в отношении того, является ли это указателем или нет...? Сначала я столкнулся с проблемой, когда хотел получить доступ к строке tType из отдельного тайла в 2Darray в Map.cpp (хотя я могу получить доступ к логической переменной canWalk просто отлично...) и не смог выяснить, в чем дело, поэтому я решил научиться реализовывать внешний журнал, чтобы найти проблему... но я думаю, что нашел путь к той же проблеме при этом...

Любая помощь очень ценится, как и критика, мне есть чему поучиться.

-

Моей первоначальной целью задать этот вопрос было (теперь я понимаю) получить глобально объявленный объект, доступный из любого файла *.cpp в многофайловой программе. Я только нашел этот ответ: http://www.cplusplus.com/forum/beginner/3848/, на случай, если это может быть полезно для кого-то еще с подобной проблемой.

1 ответ

В вашем Logfile.hpp вам не хватает #include <string>: один из ваших LogFile переменные классов объявлены std::string так что вам нужно включить это.

В вашем Engine.cpp вы забыли включить свой Engine.hpp, где ваш LogFile *log; переменная объявлена. это приводит к ошибке в вашем файле Engine.cpp, где вы пытаетесь назначить новый LogFile возражать против этого.

Так добавь #include <string> в начало вашего Logfile.hpp и добавьте #include "Engine.hpp" к вершине вашего Engine.cpp

Другие вопросы по тегам