2017-04-19 140 views
1

我得到一个未声明的标识符错误,我不知道为什么。我甚至重写了完整的内容,以确保我没有输入错字。有人能告诉我为什么我有这个错误吗?C++未声明的标识符错误

我的文件

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; 
}; 

不介意CircuitObjects,他们不给任何错误,错误:未声明 '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; 
} 

错误:未申报 '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(); 
}; 

不介意LogicSimulator.cpp,它不发出任何错误。


错误:未申报的“连接”(是的,在连接LogicSimulator是不宣)

+0

是这条道路'的#include “../LogicSimulator.hpp” “对吗?” – SrAxi

+5

循环依赖('#include's)是不好的。 – tkausl

+0

查找“前向声明”。在开始制定定义之前,您有头文件相互依赖于其他文件。 '#pragma once'(或者包含守卫)解决了多重包含的问题,但不是(必然)定义相互依赖的问题。 – Peter

回答

2

这是,正如我在评论中写道,极有可能造成你的循环包括。 Connection.hpp包括LogicSimulator.hpp,其本身包括Connection.hpp

就你而言,你甚至不需要包含。对于指针和引用,预先声明是好的:

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(); 
}; 
+0

好的,那个作品非常感谢你:D所以,如果我理解正确,我必须在头文件中声明类(类包括好的),并且我只需要在类中使用头文件? – PsychoPflanze