c++ - 在不同文件中编写类时聚合不起作用

标签 c++ header-files

<分区>

我在 2 个不同的文件中编写了 2 个类:router.h - router.cpp 和 topology.h - topology.cpp。

我将展示 .h 文件的内容,因为 .cpp 文件仅包含实现。

路由器.h:

#ifndef _ROUTER_H_
#define _ROUTER_H_
#include <map>
#include "topology.h"

using namespace std;

class Router {

public:
    int id;
    map<Router, int> linkers;
    Topology topology;

    Router();
    Router(int id);
    void addLink(Router router, int cost);
    void delLink(Router router);

};

#endif

拓扑.h:

#ifndef _TOPOLOGY_H_
#define _TOPOLOGY_H_
#include "router.h"

class Topology {
public: 
    map<Router, int> graph;  
    Topology();
    void addNode(Router router, int cost);
    void delNode(Router router);
};

#endif

我的问题是,为什么在编译时出现由无法识别的 Router 和 Topology 类引起的错误,即使我包含了 header 并添加了 ifndefs 以便不包含多个文件?我在互联网上查找,也在堆栈上查找,但没有发现任何关于这个问题的信息。

最佳答案

此代码中的问题是您的 Topology (Topology.h) 使用按值传递的 Router 对象:编译器需要具有 Router 的完整定义。很好,所以您包含了 Router.h。 但是,您的 Router 需要一个完整的 Topology 对象(不是指针,不是引用)才能工作。

所以你有一个配置,其中 A 需要 B 完全声明才能完全声明,B 需要 A 完全声明才能完全声明自己。正如评论中所述,这是循环依赖性的问题。

你应该做的是避免在 Router 中使用 Topology 对象(你可能需要一个指针,因为完整的对象意味着复制而不是共享实例)。在 Router.h(和 Router.cpp 中的 #include "Topology")中使用拓扑的前向声明,并将您的“拓扑”属性声明为指针/智能指针/引用。

关于c++ - 在不同文件中编写类时聚合不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29614831/

相关文章:

谁能建议我如何在移远MC60模块中编写自己的BLE AT命令头文件,仅供引用?

c++ - 我可以在头文件中实现所有 C++ 成员函数但不用于内联吗?

c - C中头文件的循环包含

c++ - 在奇怪的重复模板类中使用方法的返回类型作为另一个方法的参数类型

c++ - 3D 图像中的连通分量及其索引

c++ - 安全断开 asio SSL 套接字的正确方法是什么?

c++ - C++如何防止导入循环

c++ - 在这种情况下,C++ 中的 union 做了什么?

c++ - 乱七八糟的是ctime、time.h、sys/time.h

c++ - 具体类的单独头文件 - C++