【问题标题】:In C++ is there something wrong including in this way?在 C++ 中,包括这种方式有什么问题吗?
【发布时间】:2011-12-08 09:44:41
【问题描述】:

在我的程序中,我有 Vertex 的 Edges 和 Faces 类,我希望将它们用于对形状进行建模。在此之前,我的 Edge 类包括我的“vertex.h”文件,我的 Face 类包括我的 Edge.h 文件。在 Face 类中,我声明了一些边缘类型的变量,在 Edge 类中,我声明了一些顶点类型的变量。都在工作。我的问题是在我的实施过程中,我意识到我希望边缘知道它们连接在一起的面,并且我想将它存储在边缘中。我想声明一个 Face 类型的指针,并在类的构造函数中使用:

Face * joiningFaces = new joiningFaces[2];

当我这样做时,我得到了说 Face 不是一种类型的语法错误,即使我在 Edge.h 中包含 Face.h 也是如此。

是否有某种层次系统阻止我将 Edge in Face 和 Face in Edge 包括在内?还是我在做傻事?

===代码====

===edge.h===

#ifndef EDGE_H_
#define EDGE_H_
#include "Vertex.h"
#include "Face.h"



class Edge {

private:
    Vertex a;
    Vertex b;
    Face * joinsFace;

public:
    Edge();
    Edge(Vertex newa, Vertex newb);
...ect
};

===脸.h===

#ifndef FACE_H_
#define FACE_H_
#include "Edge.h"
class Face {


private:
    Edge a;
    Edge b;
    Edge c;

public:
    Face();
    Face(Edge newA, Edge newB, Edge newC);
    virtual ~Face();
    Edge getEdgeA();
    Edge getEdgeB();
    Edge getEdgeC();
};

#endif /* FACE_H_ */

【问题讨论】:

  • 发布代码,否则您将得到的只是明智的猜测。
  • 如果不查看 Face.h/.cpp、Edge.h/.cpp 和您的实际程序中的包含内容,很难理解问题或查明问题。
  • 你能告诉我们Face.hEdge.h吗?您遇到了循环依赖问题,可以通过前向声明来解决。
  • 上面的代码试图创建joiningFaces 的数组而不是Faces 的数组——你定义了joiningFaces 类吗?
  • 谢谢,我已经添加了代码 sn-ps。

标签: c++ file header include


【解决方案1】:

你有一个循环引用;如果你只需要在Edge.h中引用Face的指针或引用,那么你可以转发声明Face而不是包括Face.h

class Face;

想想包含是如何工作的:如果你将Face.h 的内容粘贴到Edge.h,然后将Edge.h 的内容粘贴到Face.h,你将陷入无限循环; include 守卫防止多重包含:

#ifndef X_H
#define X_H

// ...

#endif

但是,如果您有相互引用的类,则必须前向声明它们中的一个或两个,以打破循环。

【讨论】:

  • 啊,无限循环问题是有道理的!我会尝试前向声明。
  • 它编译!!非常感谢乔恩 ;)
【解决方案2】:

如果要在边缘类中声明指向 Face 的指针,编译器需要声明 Face。如果实例化 Face 对象,编译器需要 Face 类的定义。

// edge.hpp
class Face;  // forward declaration
class Edge
{
public:
  Edge(Face* myFace);
private:
  Face* myFace_;
};

// edge.cpp
#include face.hpp  // <- include the Face definition here

....

【讨论】:

  • 谢谢,这就是问题所在。 :) 前向声明很漂亮。
【解决方案3】:

从技术上讲,您应该在头文件中使用&lt;name&gt;.h 扩展名对所有类进行原型设计,然后将代码写入相应的.cpp 文件中。如果一个类需要引用另一个类,只需将包含文件添加到正在引用的类的.h。例如,如果面指的是边,则将edge.h 添加到face.h。不要在main.cpp (or wherever the main function is) 中重新包含edge.h。您还可以选择将代码写入'.h' 文件本身。选择权在你。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多