C++ déclaration anticipée d'erreur
J'ai une erreur qui va comme ceci
In file included from Level.hpp:12,
from main.cpp:4:
Corridor.hpp: In method `void Game::Corridor::update()':
Corridor.hpp:41: invalid use of undefined type `class Game::Level'
Corridor.hpp:13: forward declaration of `class Game::Level'
Corridor.hpp:42: invalid use of undefined type `class Game::Level'
Corridor.hpp:13: forward declaration of `class Game::Level'
Corridor.hpp:43: invalid use of undefined type `class Game::Level'
Corridor.hpp:13: forward declaration of `class Game::Level'
Corridor.hpp:44: invalid use of undefined type `class Game::Level'
Corridor.hpp:13: forward declaration of `class Game::Level'
Couloir et le Niveau est ...
//Corridor.hpp
#ifndef GAME_CORRIDOR_HPP
#define GAME_CORRIDOR_HPP
#include <Moot/Math.hpp>
//#include <Level.hpp>
#include <GameWindow.hpp>
namespace Game
{
class Level; //<-- LINE 13
class Corridor
{
static const unsigned int defaultLevelDepth = 800;
Moot::Math::Vector3D wp1, wp2, wp3, wp4;
Moot::Math::Vector2D sp1, sp2, sp3, sp4;
Level * p_level;
public:
Corridor(Moot::Math::Vector3D setFirstPoint, Moot::Math::Vector3D setSecondPoint)
{
wp1 = setFirstPoint;
wp2 = setSecondPoint;
wp3 = setFirstPoint;
wp3.z += defaultLevelDepth;
wp4 = setSecondPoint;
wp4.z += defaultLevelDepth;
}
void update() {
sp1 = p_level->getLevelCamera().convert3DVectorWithScreenAlgorithm(wp1); //<- LINE 41 etc.
sp2 = p_level->getLevelCamera().convert3DVectorWithScreenAlgorithm(wp2);
sp3 = p_level->getLevelCamera().convert3DVectorWithScreenAlgorithm(wp3);
sp4 = p_level->getLevelCamera().convert3DVectorWithScreenAlgorithm(wp4);
//p_level->getLevelCamera();
}
void draw()//const
{
Moot::Color tempColor;
windowInstance().graphics().drawQuad( sp1.x, sp1.y, tempColor,
sp2.x,sp2.y, tempColor,
sp3.x, sp3.y, tempColor,
sp4.x,sp4.y, tempColor, 1);
}
void setLevel(Level* setLevel) {
p_level = setLevel;
}
};
}
#endif
et
//Level.hpp
#ifndef GAME_LEVEL_HPP
#define GAME_LEVEL_HPP
#include <Moot/Forward.hpp>
#include <Moot/Window.hpp>
#include <Moot/Math.hpp>
#include <GameWindow.hpp>
#include <Camera.hpp>
#include <Corridor.hpp>
#include <Player.hpp>
#include <vector>
namespace Game
{
class Level
{
typedef Corridor* p_corridor;
typedef std::vector<p_corridor> CorridorList;
typedef CorridorList::reverse_iterator ReverseCorridorItter;
CorridorList m_map;
Camera m_camera;
Player m_player;
public:
Level()
{
m_player.setLevel(this);
//Lots of vertices being defined into m_map.
//Loop through and set camera
ReverseCorridorItter rit;
for(rit = m_map.rbegin(); rit != m_map.rend(); rit++)
(*rit)->setLevel(this);
}
~Level()
{
ReverseCorridorItter rit;
for(rit = m_map.rbegin(); rit != m_map.rend(); rit++)
delete (*rit);
m_map.clear();
}
void update()
{
//Temp delete when input and player are implimented.
if(pad[0].buttons & PAD_UP)
m_camera.updateTargetOffsets(0, -2);
if(pad[0].buttons & PAD_DOWN)
m_camera.updateTargetOffsets(0, 2);
if(pad[0].buttons & PAD_LEFT)
m_camera.updateTargetOffsets(-2, 0);
if(pad[0].buttons & PAD_RIGHT)
m_camera.updateTargetOffsets(2, 0);
m_player.update();
ReverseCorridorItter rit;
for (rit = m_map.rbegin(); rit != m_map.rend(); rit++)
(*rit)->update();
}
void draw() //const //EH!!! wtf ReverseIter isn't a member
{
m_player.draw();
ReverseCorridorItter rit;
for (rit = m_map.rbegin(); rit != m_map.rend(); rit++)
(*rit)->draw();
}
Camera& getLevelCamera() {
return m_camera;
}
};
}
#endif
Le pointeur est défini comme ce que j'en dis, mais quand j'essaie d'accéder à une fonction de Niveau, BOOM!
Grâce.
PS: Le compilateur est gcc 2.95.2 si cela fait une différence.
MODIFIER
Mis à jour avec le code complet.
Le Couloir.php que vous avez posté ne semble pas avoir de 47 lignes de code. Aussi, c'est un vieux version de gcc.
Que faites-vous sur la ligne 47 de couloir.hpp?
Qu'est-ce que la ligne 47?
De ce que je vois, vous êtes, y compris le niveau.hpp dans le couloir.hpp et vice-versa, ce qui semble un peu étrange.
Bailey édité grâce pour cela. ouais très vieux gcc ne peut pas être aidé 🙁
Que faites-vous sur la ligne 47 de couloir.hpp?
Qu'est-ce que la ligne 47?
De ce que je vois, vous êtes, y compris le niveau.hpp dans le couloir.hpp et vice-versa, ce qui semble un peu étrange.
Bailey édité grâce pour cela. ouais très vieux gcc ne peut pas être aidé 🙁
OriginalL'auteur | 2010-11-16
Vous devez vous connecter pour publier un commentaire.
Vous
#include
-ingLevel
's complet de la déclaration:...et puis vous essayez de déclarer
Level
:Ne pas le faire. Choisir l'un ou l'autre. (modifier) Ou au moins mettre de l'avant-déclaration avant le
#include
-ion de la déclaration complète. Si tout ce que vous faites dansgame_corridor.hpp
est de définir des pointeurs vers uneLevel
, puis une avant de déclarer doit faire amende. Si toutefois vous avez besoin pour appeler des fonctionsLevel
de l'intérieur de la centrale de fichier, alors vous aurez besoin de#include
complet de la déclaration.EDIT2:
Basé sur votre clarifier les modifier à votre opération, vous doit
#include
complet de la déclaration deLevel
, et de ne pas essayer d'utiliser une déclaration anticipée.class Game::Level' and forward declaration of
Jeu de la classe::le Niveau". Je l'ai ajouté à la poste.Se débarrasser de la déclarer avant
se débarrasser de l'avant donne moi des charges des erreurs de syntaxe, peu importe si le Niveau est inclus ou pas.
Modifier votre OP avec le poing quelques-uns de ces & éditée code source
J'ai ajouté le code source complet, et de l'erreur, de ne pas y compris le niveau.hpp dans le couloir.php
OriginalL'auteur John Dibling
Si vous en avant-déclarer
Game::Level
alors ne pas #include. Dans une note connexe, l'utilisation#include "header.hpp"
, pas#include <header.hpp>
.Modifier selon vos mises à jour: rendre la définition de
Game::Corridor::update()
à l'extérieur de l'en-tête et dans un fichier d'implémentation. De cette façon, la compilation n'a pas besoin de savoir quelque chose au sujet deGame::Level
outre le fait qu'il existe et c'est un type.angle crochets sont conçus pour le système comprend; les guillemets doubles sont destinées à l'utilisateur les en-têtes. Ce n'est pas une question de goût; il y a des variables d'environnement et les valeurs par défaut de compter sur ce.
J'ai l'habitude de penser de cette façon, aussi, et a fait valoir avec beaucoup de vigueur toute personne qui n'a autrement. Basé sur des choses que j'ai lu, et je suis venu à la conclusion que c'est mal. Je vais regarder pour certains postes. (Peut prendre du temps)
En voici un: stackoverflow.com/questions/3469588/...
Voici une autre référence (externe): dans Le cadre du programme de normes de codification à la page. 22 dire "La directive #include doit utiliser le <nom de fichier.h> notation pour inclure les fichiers d'en-tête." à cause de "malheureux de divergence dans les implémentations de fournisseur". lien: www2.research.att.com/~bs/JSF-AV-règles.pdf
OriginalL'auteur wilhelmtell
Le problème est que le Couloir ne sais pas ce qu'est un Niveau, parce qu'on ne peut pas vraiment #include Niveau.php, car le Niveau.php est ce que #inclus Couloir.hpp.
Le problème sous-jacent est que vous essayez de #include d'un fichier source. Le vraiment problème sous-jacent est que vous utilisez
#include
lorsque vous n'avez pas séparé de votre code dans les fichiers source et les fichiers d'en-tête. Voici comment scinder. (Je suppose que vous êtes familier avec la compilation de la source des fichiers dans les fichiers objets, puis de les relier dans des exécutables.)Couloir.hpp:
Corridor.cpp:
OriginalL'auteur Beta