Toon posts:

[C++] Foward declaration

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het volgende probleem doet zich voor:

Class B erft van class A. CLass A heeft type van B.
Er werd al gewezen op een foward declaration maar...werkt niet!
Het moet mogelijk zijn om B te veranderen in A.

Als ik het gemaakte type van B(in A) wil aanspreken door bv b->get(); dan geeft hij de volgende foutmeldingen:
- error C2027: use of undefined type 'B'
- error C2227: left of '->get' must point to class/struct/union


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
A.h: 
#ifndef A_H 
#define A_H 

class B; 
class A 
{ 
   private: 
       B *b; 
}; 
#endif 
------------------------------------------------ 
B.h: 
#ifndef B_H 
#define B_H 

#include "A.h" 

class B :  public A 
{ 
   public:
        int get(){return 2};
}; 
#endif
8)

[ Voor 31% gewijzigd door Verwijderd op 11-03-2003 11:27 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
werkt niet? Hoezo werkt niet?

Ik raad je aan om de P&W quickstart eens te lezen, en je topic aan te passen met de nodige/gevraagde informatie. Anders kunnen we je niet verder helpen.
Welkom in P&W -> Quickstart (update 2/10/2002)

Ik vraag me eigenlijk af waarom je B van A laat inheriten als A al een instance van klasse B heeft....

[ Voor 31% gewijzigd door whoami op 11-03-2003 10:40 ]

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zou perfect moeten werken hoor... doe anders eens de feitelijke errors copy/pasten?

Professionele website nodig?


Verwijderd

Topicstarter
Aangepast met voorbeeld en foutmeldingen.
(Maak gebruik van Visual Studio)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Ik zie helemaal geen ->get?
En return=2; moet natuurlijk return 2; zijn.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Ik zie dat je in A een pointer hebt naar een object van de class B, maar dat je nergens geheugen alloceerd voor dat object.
code:
1
b = new B();


Waar doe je b->get()?

https://fgheysels.github.io/


Verwijderd

Topicstarter
b->get() wordt in een van de methodes van A uitgevoerd.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Heeft A een constructor waarbij je b alloceert?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Yep, die heeft hij

  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
code:
1
2
3
4
5
6
7
8
9
10
A.h:  
#ifndef A_H  
#define A_H  
class B;  
class A  
{  
   private:  
       B *b;  
};  
#endif 


logisch, B is niet gedeclareerd. (#include "B.h")

/me weet geen leuke quote voor in zijn signature


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Als je in A methoden uit B wil gebruiken, dan zal dat moeilijk gaan. A weet immers nog niet hoe B er uit ziet, want die header wordt later pas ingelezen. Weet niet of dit wel uberhaupt wel mogelijk is zo. A is nl afhankelijk van B en B van A. Er is dus geen declaratie-volgorde waarbij alles correct geinitialiseerd wordt.
Wat je misschien wel kunt doen is in A een private A *b declareren en dan rommelen met dynamic casting, maar ik weet niet hoe soepel dat loopt...

[ Voor 19% gewijzigd door SWfreak op 11-03-2003 11:44 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Wellicht een idee om even een nieuw topic te starten waarin je wel direct je hele sourcecode post en de relevante errors met regelnummers. Als je de code niet geeft waarin de error optreedt kunnen we wel blijven raden, en dit topic is ondertussen wel al het overzicht kwijt.

Professionele website nodig?


Verwijderd

Topicstarter
Heren, (Dames),
bedankt. Maar dan kan ik niet aan beginnen.
Tot zo ver bedankt.
Scar

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

SWfreak schreef op 11 March 2003 @ 11:42:
Als je in A methoden uit B wil gebruiken, dan zal dat moeilijk gaan. A weet immers nog niet hoe B er uit ziet, want die header wordt later pas ingelezen. Weet niet of dit wel uberhaupt wel mogelijk is zo. A is nl afhankelijk van B en B van A. Er is dus geen declaratie-volgorde waarbij alles correct geinitialiseerd wordt.
Wat je misschien wel kunt doen is in A een private A *b declareren en dan rommelen met dynamic casting, maar ik weet niet hoe soepel dat loopt...


het kan wel, de implementatie staat namelijk niet in de header van A. Bij de definitie van A moet B dus gedeclareerd zijn, maar bij de implementatie van A moet B gedefinieerd

In A.cpp moet je dus simpelweg B.h includen, en dan werkt het prima

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
KnoppenSpook schreef op 11 March 2003 @ 11:40:
code:
1
2
3
4
5
6
7
8
9
10
A.h:  
#ifndef A_H  
#define A_H  
class B;  
class A  
{  
   private:  
       B *b;  
};  
#endif 


logisch, B is niet gedeclareerd. (#include "B.h")
|:(
Wat zeggen we nou de hele tijd, dat moet je dus NIET doen. #include "B.H' moet alleen in A.cpp, daar waar de b->get() staat. In A.h hoef je helemaal niets van class B te weten.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Wat zeggen we nou de hele tijd, dat moet je dus NIET doen. #include "B.H' moet alleen in A.cpp, daar waar de b->get() staat. In A.h hoef je helemaal niets van class B te weten.
Dat si niet waar, A moet volgens mij wel weten wat de structuur van B is! Anders kan deze nooit b->get() doen.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Verwijderd schreef op 11 maart 2003 @ 17:04:
Dat si niet waar, A moet volgens mij wel weten wat de structuur van B is! Anders kan deze nooit b->get() doen.
Dat hoeft pas in de implementatie (het .c-bestand) en niet in de declaratie (het .h-bestand). Bij de declaratie hoeft alleen bekend te zijn dat klasse B bestaat, tenzij de klasse als member variable gebruikt wordt, want dan moet zijn grootte bekend zijn (en moet het type dus volledig gedeclareerd zijn).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 11 March 2003 @ 17:04:
[...]

Dat si niet waar, A moet volgens mij wel weten wat de structuur van B is! Anders kan deze nooit b->get() doen.


staat de regel b->get () ergens in A.h dan? Nee, die staat in A.cpp. En DAAR moet de structuur van B dan ook pas bekend zijn, niet al in A.h (tenzij je B niet gebruikt als pointer/reference, zoals een membervar zoals Soultaker al zei, of als functie parameter of returntype

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Scar: Wellicht even ten overvloede, maar bedenk je dat #include niets anders is dan een inline expansion van de betreffende file. Doe eens voor de lol met de hand van al je files 1 grote file maken waarin je de includes handmatig copy/paste, wellicht wordt je dan duidelijker wat oisyn en Soultaker bedoelen.

Professionele website nodig?

Pagina: 1