2013-06-27 3 views
3

Я программирую график, используя список списков. Для этого у меня есть два класса, и каждый из этих классов имеет указатель на другой объект того же класса и указатель на объект второго класса. Вот код:'[Имя класса]' не называет тип в C++

Файл V.h:

#ifndef VERTICEPUNT_H 
#define VERTICEPUNT_H 

#include "A.cpp" 

typedef char E; 

class V 
{ 
    public: 
    E etiqueta; 
    V* siguiente; 
    A* primera; //<- Error: 'A' does not name a type 

    V(); 
    ~V(); 
}; 

#endif // VERTICEPUNT_H 

Файл V.cpp:

#include "V.h" 

V::V() 
{ 
    etiqueta = ' '; 
    siguiente = 0; 
    primera = 0; //<- Error: 'primera' was not declared in this scope 
} 

V::~V() 
{ 
    delete primera; 
    delete siguiente; 
} 

хиджры Файл:

#ifndef ARISTAPUNT_H 
#define ARISTAPUNT_H 

#include "V.cpp" 

typedef int P; 

class A 
{ 
    public: 
     P peso; 
     V* vertice; 
     A* siguiente; 

     A(); 
     ~A(); 
}; 

#endif // ARISTAPUNT_H 

a.cpp:

#include "A.h" 

A::A() //<- Error: 'A' does not name a type 
{ 
    peso = 0; 
    siguiente = 0; 
    vertice = 0; 
} 

A::~A() // <- Error: 'A' does not name a type 
{ 
    delete siguiente; 
} 

Как я мог бы исправить это?

ответ

4

Сообщение означает, что имя класса не имеет значения. V.h не должен включать A.cpp, он должен включать A.h. То же самое касается A.h включение V.cpp.

В общем, вы никогда не хотите #include CPP-файл - из заголовка или из другого файла CPP. Только заголовочные файлы .h предназначены для включения препроцессором.

В случае круговых определений, как это, вы должны направить, объявить класс указатель на который вы определяете, и отказаться от включения заголовка этого класса:

#ifndef VERTICEPUNT_H 
#define VERTICEPUNT_H 

class A; // <<== Forward declare the class. 

typedef char E; 

class V 
{ 
    public: 
    E etiqueta; 
    V* siguiente; 
    A* primera; 

    V(); 
    ~V(); 
}; 

#endif // VERTICEPUNT_H 
+0

Я попробовал, и он фиксирует ошибку , Тем не менее, я получаю пару предупреждений, таких как возможные проблемы при вызове ~ V, и недопустимое использование этого класса. –

+1

@ J-orgeMataVillalobos У вас такая же проблема в обоих файлах, поэтому вам нужно реализовать аналогичные изменения в обоих местах. – dasblinkenlight