C ++:如何在同一个.cpp上声明两个类在编译时“看到”?

时间:2011-11-11 19:38:18

标签: c++ forward-declaration

在VS2008上编译此代码时:

  #include <vector>

using namespace std;

class Vertex {

public: double X; 
        double Y;
        double Z;

        int id; // place of vertex in original mesh vertex list

        vector<Vertex*> neighbor; //adjacent vertices

        vector<Triangle*> face; // adjacent triangles

        float cost; // saved cost of collapsing edge

        Vertex *collapse; // 
};



 class Triangle {

public:
    Vertex * vertex[3]; 


};

我收到以下错误:

1>.\Triangle.cpp(15) : error C2065: 'Triangle' : undeclared identifier 

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

您使用前瞻声明:

class Traingle;

class Vertex
{
    ...
};

class Triangle
{
    ...
};

类型的前向声明(例如class Triangle)允许您声明指向该类型的指针或引用,但不能声明该类型的对象。换句话说

class Triangle;
class Vertex
{
  vector<Triangle*> face;
};

将编译,但

class Triangle;
class Vertex
{
  vector<Triangle> face;
};

不会编译。

此外,类型的前向声明不允许您访问其成员,因为编译器还不知道它们。因此,必须在完全定义类型后定义使用前向声明类型的对象的成员函数。在您的情况下,在class Triangle

的定义之后

哦,这根本不是Visual Studio特有的。这只是标准的C ++。

答案 1 :(得分:2)

您需要在Vertex类之前转发声明Triangle类。在这种情况下看起来像这样:

#include <vector>

using namespace std;

class Triangle;

class Vertex {
public:
        double X; 
        double Y;
        double Z;

        int id; // place of vertex in original mesh vertex list

        vector<Vertex*> neighbor; //adjacent vertices
        vector<Triangle*> face; // adjacent triangles
        float cost; // saved cost of collapsing edge

        Vertex *collapse; // 
};

class Triangle {
public:
    Vertex * vertex[3]; 
};

previous question似乎包含有关前向声明的详细信息。