[C++] probleem met forward declaration

Pagina: 1
Acties:

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Ik was bezig met bestaande code te herschrijven zodat deze dmv overerving bepaalde dingen overneemt.

Nu loop ik tegen het volgende probleem aan. Class A wil Class B gaan gebruiken voor zijn werking.
code:
1
class A: public B {...

Nu geeft code::blocks echter het volgende commentaar:
code:
1
2
A.h: error: invalid use of undefined type `struct B'
A.h: error: forward declaration of `struct B'

Waarbij in A.h voor de aanroep van de A class natuurlijk B.h geinclude wordt en ook gedeclareerd middels
code:
1
class B;


Ik kon niks zinnigs vinden, dus ik hoop dat jullie me kunnen vertellen wat ik hier verkeerd doe :)

oprecht vertrouwen wordt nooit geschaad


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 17:10

BoAC

Memento mori

Post eens de complete inhoud van A.h en B.h :)
Dit is mij niet helemaal duidelijk.

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
ik had A en B even gebruikt als abstracte voorbeelden, de complete inhoud posten lijkt me niet zo handig, maar hier staan volgens mij de relevante stukken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(class A)
#ifndef _HOOBJECT_H_
#define _HOOBJECT_H_

#include "HandsOffGameEngine.h"
#include "point3f.h"
#include "manipulate.h"
#include <string>
#include <fstream>
#include <vector>

class HandsOffGameEngine;
class manipulate;
[...]
class HOobject: public manipulate {...

code:
1
A.h: error: invalid use of undefined type `struct B'
slaat dus op regel 15
code:
1
A.h: error: forward declaration of `struct B'
slaat hier op regel 13
verder is er dus nog:
code:
1
2
3
4
5
6
7
8
9
10
11
(class B)
#ifndef _MANIPULATE_H_
#define _MANIPULATE_H_

#include "HandsOffGameEngine.h"
#include "point3f.h"
#include "HOflags.h"

class HandsOffGameEngine;

class manipulate {...

oprecht vertrouwen wordt nooit geschaad


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Bij overerving kan je geen forward declaration gebruiken.
Je zou dus je header moeten included van de klasse waar je van overerft :)

Ik zie dat je na je include, je definitie van klasse manipulate veranderd, als je die weghaald is volgens mij het probleem weg.

Forward declaration is juist verzonnen om zo minder headers te hoeven includen.

[ Voor 48% gewijzigd door TheNameless op 21-06-2006 10:56 ]

Ducati: making mechanics out of riders since 1946


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Haal die class manipulate; eens weg in regel 13. Je include manipulate.h waarin deze klasse staat dus hoef je die regel er niet neer te zetten. Misschien gaat ie daarom ook mis. Voor regel 12 geldt hetzelfde, ik neem aan dat de class HandsOffGameEngine al in HandsOffGameEngine.h staat. Dus hoef je hem daar niet in regel 12 te declareren.

offtopic:
Ik moet sneller typen :+

[ Voor 8% gewijzigd door The Fox NL op 21-06-2006 10:54 ]


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
dan zegt ie doodleuk:
code:
1
A.h:15: error: expected class-name before '{' token

:/

oprecht vertrouwen wordt nooit geschaad


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Ik zie dat je in manipulate.h ook een HOflags.h hebt zitten. Zit in die HOflags weer een verwijzing naar HOobjects.h? Dan krijg je cirkel reference.

manipulate.h (class B ) wil HOflags.h hebben. HOflags.h wil HOobjects.h (class A). HObjects.h wil manipulate.h hebben.
Dus misschien dat je het kan oplossen door HOflags.h uit manipulate.h te halen en een forward declaration te gebruiken voor die HOflags class. Ik weet niet precies hoe je code in elkaar zit, dus ik kan fout zitten.

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
De forward-declaraties moet je in dit geval boven de includes zetten :).

  • DieterVDW
  • Registratie: Juli 2002
  • Laatst online: 12-02-2017
Als je een klasse gebruikt als pointer, dan heeft de compiler genoeg als je deze klasse gewoon forward declaret dmv 'class bla'.
Als je de klasse echter gebruikt (de klasse is een attribuut van de andere klasse, of je hebt code staan die die klasse gebruikt), dan moet de compiler meer weten over de klasse en moet je de headerfile includen.

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
The Fox NL schreef op woensdag 21 juni 2006 @ 11:15:
Ik zie dat je in manipulate.h ook een HOflags.h hebt zitten. Zit in die HOflags weer een verwijzing naar HOobjects.h? Dan krijg je cirkel reference.

manipulate.h (class B ) wil HOflags.h hebben. HOflags.h wil HOobjects.h (class A). HObjects.h wil manipulate.h hebben.
Dus misschien dat je het kan oplossen door HOflags.h uit manipulate.h te halen en een forward declaration te gebruiken voor die HOflags class. Ik weet niet precies hoe je code in elkaar zit, dus ik kan fout zitten.
HOflags include niks, dus dat zit wel goed.
Shadowman schreef op woensdag 21 juni 2006 @ 11:18:
De forward-declaraties moet je in dit geval boven de includes zetten :).
Heb ik gedaan, maar dat mocht niet baten.
DieterVDW schreef op woensdag 21 juni 2006 @ 11:24:
Als je een klasse gebruikt als pointer, dan heeft de compiler genoeg als je deze klasse gewoon forward declaret dmv 'class bla'.
Als je de klasse echter gebruikt (de klasse is een attribuut van de andere klasse, of je hebt code staan die die klasse gebruikt), dan moet de compiler meer weten over de klasse en moet je de headerfile includen.
Ik include de headerfile, maar dat gaat niet helemaal lekker (waarschijnlijk omdat ie al geinclude is?)

De enige andere plek waar manipulate.h wordt geinclude is manipulate.cpp.

oprecht vertrouwen wordt nooit geschaad


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Kijk dan alle geinclude headers na en check of er geen cirkel referenties in zitten.

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
ja, heb alle includes vanaf het begin opnieuw ingesteld en dat heeft het probleem opgelost :)
Maar vergis ik me nu met de gedachte dat de #ifndef regel ervoor zou moeten zorgen dat er geen cirkel referenties kunnen ontstaan ?

oprecht vertrouwen wordt nooit geschaad


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 18:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Atgast schreef op woensdag 21 juni 2006 @ 12:08:
ja, heb alle includes vanaf het begin opnieuw ingesteld en dat heeft het probleem opgelost :)
Maar vergis ik me nu met de gedachte dat de #ifndef regel ervoor zou moeten zorgen dat er geen cirkel referenties kunnen ontstaan ?
Ja en nee. Het zorgt ervoor dat er niet oneindig recursief geinclude wordt, maar het lost natuurlijk niet je compile errors op (zoals je al zag). Het is wel vrij makkelijk te voorkomen:

Voor alle classes/structs/unions/enums waar je de definitie niet voor nodig hebt gebruik je forward declares en #include je ze dus niet. Je hebt ze niet nodig voor functie-return-values en -parameters, en voor pointers/references naar dat type. En in sommige gevallen ook niet voor template parameters, maar dat hangt er een beetje vanaf.

Je hebt ze wel nodig voor members, baseclasses, de sizeof operator en als je natuurlijk simpelweg iets met het type doet (bijvoorbeeld als je een nested type wilt gebruiken of als je een memberfunctie erop aanroept). Dan #include je ze.

Als je dit patroon aanhoudt en je krijgt alsnog errors dan klopt je structuur niet :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
ok, ik heb nu het volgende gedaan.
Overal de includes weggehaald, behalve de .h die bij het betreffende .cpp bestand hoort. Vervolgens gekeken welke foutmeldingen er kwamen, en dan een forward declaration toegevoegd, tenzij hij de header nodig had.

Als ik het goed begrijp is dit wat je aangaaf .oisyn en het werkt prima :)

oprecht vertrouwen wordt nooit geschaad

Pagina: 1