【问题标题】:C++ undeclared identifier errorC++ 未声明的标识符错误
【发布时间】:2017-04-19 12:20:13
【问题描述】:

我收到一个未声明的标识符错误,我不知道为什么。我什至重写了完整的东西,以确保我没有打错字。谁能告诉我为什么会出现这个错误?

我的文件是

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,它不会给出任何错误。


错误:未声明的“连接”(是的,在连接逻辑模拟器中未声明)

【问题讨论】:

  • 这条路径#include "../LogicSimulator.hpp"正确吗?
  • 循环依赖 (#includes) 不好。
  • 查找“前向声明”。在开始定义之前,您有相互依赖的头文件被包含在内。 #pragma once(或包含守卫)解决了多重包含的问题,但不是(必然)定义相互依赖的问题。

标签: c++


【解决方案1】:

正如我在 cmets 中所写的,这很可能是由您的循环包含引起的。 Connection.hpp 包含 LogicSimulator.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();
};

【讨论】:

  • 好的,非常感谢:D 所以,如果我理解正确,我只需在头文件中声明类(类是包含好的),我只需要包含在类中使用头文件?
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2014-02-21
  • 1970-01-01
  • 2013-01-22
  • 2011-10-25
  • 2011-02-15
相关资源
最近更新 更多