C ++: Как я могу сделать два класса, объявленные на одном и том же .cpp, «видеть» друг друга во время компиляции? - PullRequest
3 голосов
/ 11 ноября 2011

При компиляции этого кода на 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 ]

6 голосов
/ 11 ноября 2011

Вы используете предварительную декларацию:

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 ++.

2 голосов
/ 11 ноября 2011

Вам необходимо объявить класс Triangle перед классом Vertex. В этом случае это будет выглядеть примерно так:

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

Этот предыдущий вопрос содержит подробные сведения о предварительном объявлении.

...