Leon Marzahn
Leon Marzahn

Reputation: 349

C++ undeclared identifier error

I'm getting an undeclared identifier error and I don't know why. I even rewrote the complete stuff to make sure I didn't do a typo. Can someone tell me why I got this error?

My files are

Connection.hpp

#pragma once

#include "../LogicSimulator.hpp"
#include "CircuitObject.hpp"

class Connection
{
public:
    Connection(CircuitObject& c1, CircuitObject& c2, LogicSimulator& 
        simulator);
private:
    int state;
    CircuitObject& c1;
    CircuitObject& c2;
    LogicSimulator& simulator;
};

Don't mind the CircuitObjects, they don't give out any errors, errors are: undeclared 'LogicSimulator'

Connection.cpp

#pragma once

#include "Connection.hpp"
#include "../LogicSimulator.hpp"
#include "CircuitObject.hpp"

Connection::Connection(CircuitObject& c1, CircuitObject& c2, LogicSimulator& 
    simulator) : c1(c1), c2(c2), simulator(simulator)
{
    state = c1.State;
}

Errors: undeclared 'LogicSimulator'

LogicSimulator.hpp

#pragma once

#include "Simulator\CircuitObject.hpp"
#include "Simulator\Connection.hpp"
#include <SFML\Graphics.hpp>
#include <vector>

class LogicSimulator
{
public:
    std::vector<CircuitObject*> circuitObjects;
    std::vector<CircuitObject*> selectedCircuitObjects;
    std::vector<Connection*> connections;
    sf::RenderWindow Window;

    void Init();
private:
    void start();
    void draw();
};

Don't mind LogicSimulator.cpp, it doesn't give out any errors.


Errors: undeclared 'Connection' (Yeah, and in Connection LogicSimulator is undeclared)

Upvotes: 1

Views: 4828

Answers (1)

tkausl
tkausl

Reputation: 14269

This is, as I wrote in the comments, most likely caused by your circular includes. Connection.hpp includes LogicSimulator.hpp which itself includes Connection.hpp.

In your case, you don't even need the includes. For Pointers and References, a forward declaration is fine:

Connection.hpp:

#pragma once

class CircuitObject;
class LogicSimulator;

class Connection
{
public:
    Connection(CircuitObject& c1, CircuitObject& c2, LogicSimulator& 
        simulator);
private:
    int state;
    CircuitObject& c1;
    CircuitObject& c2;
    LogicSimulator& simulator;
};

LogicSimulator.hpp:

#pragma once

#include <SFML\Graphics.hpp>
#include <vector>

class CircuitObject;
class Connection;

class LogicSimulator
{
public:
    std::vector<CircuitObject*> circuitObjects;
    std::vector<CircuitObject*> selectedCircuitObjects;
    std::vector<Connection*> connections;
    sf::RenderWindow Window;

    void Init();
private:
    void start();
    void draw();
};

Upvotes: 2

Related Questions