[C++] Functies zonder uitwerking :?

Pagina: 1
Acties:
  • 122 views sinds 30-01-2008
  • Reageer

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Zoals de titel al doet vermoeden, ik kwam gisteravond een raar probleem tegen.
Ik zag in 'n class, een functie die wel argumenten aannam, maar nergens een uitwerking had:
C++:
1
2
3
4
// zo ken ik ze ( voorbeeld )
int GetNumSquare( int num ) { return num * num }
// nu zag ik dus deze constructor, ik zal het precieze voorbeeld maar overnemen:
ClassName( HINSTANCE hInstance, LPTSTR szWindowClass, LPTSTR szTitle, WORD wIcon, WORD wSmallIcon, int iWidth = 640, int iHeight = 480 );


Ik snap het niet, die functie komt nergens anders mee terug,
dat wilde ik dus ook simpel proberen, kijken of ik het zelf op kon lossen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

bool trueorfalse( int a );

int main( )
{
    if( trueorfalse( 11 ) )
       cout << "True!" << endl;
    else
       cout << "False!" << endl;
       
    system( "pause" );
    return 0;
}


Maar dat compileerde dus niet eens :(

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:02
code:
1
2
3
4
5
6
7
8
9
10
11
12
class MyClass
{
   private:
       int _someVar;
   public:
       void DoSomething();
} ;

void MyClass::DoSomething()
{
     // code
}

:?

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Een functie moet altijd een implementatie hebben, dus die is er echt wel maar waarschijnlijk ergens anders dan jij verwacht ;) (zoals in een base class bijv.)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
whoami schreef op zondag 10 april 2005 @ 10:26:
code:
1
2
3
4
5
6
7
8
9
10
11
12
class MyClass
{
   private:
       int _someVar;
   public:
       void DoSomething();
}

void MyClass::DoSomething()
{
     // code
}

:?
Zowel inline als erna staat er niets, ik denk dat ik dit boekje aan de kant gooi, voordat ik verder in de war raakt.

Maar het klopt dus niet?

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

edit:

oops ik had de vraag fout gelezen

[ Voor 90% gewijzigd door H!GHGuY op 10-04-2005 10:42 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Je mag in een class een functie declareren zonder de functie dan een body te geven, zolang de functie maar niet gebruikt wordt. Gebruik je de functie wel, dan krijg je geen compiler error maar een unresolved external symbol error tijdens het compileren. De compiler weet namelijk niet waar jij de functie body gedefinieerd hebt.

[ Voor 3% gewijzigd door Verwijderd op 10-04-2005 10:35 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op zondag 10 april 2005 @ 10:34:
Je mag in een class een functie declareren zonder de functie dan een body te geven, zolang de functie maar niet gebruikt wordt. Gebruik je de functie wel, dan krijg je geen compiler error maar een unresolved external symbol error tijdens het compileren. De compiler weet namelijk niet waar jij de functie body gedefinieerd hebt.
afaik is dat niet de taak van de compiler om daarover te struikelen, doorgaands doet de linker dat :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:02
Creepy schreef op zondag 10 april 2005 @ 10:30:
Een functie moet altijd een implementatie hebben, dus die is er echt wel maar waarschijnlijk ergens anders dan jij verwacht ;) (zoals in een base class bijv.)
Dan ga je toch geen functie-definitie in die 'inherited' class gaan opnemen ?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:02
SH4D3H schreef op zondag 10 april 2005 @ 10:31:
[...]


Zowel inline als erna staat er niets, ik denk dat ik dit boekje aan de kant gooi, voordat ik verder in de war raakt.

Maar het klopt dus niet?
Die functie-implementatie kan gerust in een andere file staan.
In C++ is het zo dat de class - definitie meestal in een header file staat, en de implementatie in een cpp file.

MyClass.h:
code:
1
2
3
4
5
6
7
class MyClass
{
     private:
        int _miep;
     public:
        void DoSomething();
};


MyClass.cpp:
code:
1
2
3
4
5
#include <MyClass.h>

void MyClass::DoSomething()
{
}

https://fgheysels.github.io/


Verwijderd

Ik weet niet welke compiler je gebruikt, maar als je VS6 of VS7 gebruikt kan je bij een functiedefinitie op de rechter muisknop drukken en naar 'Find Reference' (ofzo) toe gaan. Dan gaat hij zoeken naar de implementatie. :Y)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

whoami schreef op zondag 10 april 2005 @ 10:38:
[...]


Dan ga je toch geen functie-definitie in die 'inherited' class gaan opnemen ?
Nou laat mijn C++ kennis me wat dat betreft in de steek maar bijv. in Delphi kan je zo in je subclass een protected functie van de superclass public maken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • whoami
  • Registratie: December 2000
  • Laatst online: 01:02
Creepy schreef op zondag 10 april 2005 @ 11:04:
[...]

Nou laat mijn C++ kennis me wat dat betreft in de steek maar bijv. in Delphi kan je zo in je subclass een protected functie van de superclass public maken.
Je bedoelt dat je in je subclass een method van je base class kunt overriden ? Ja, ok, maar, ook dan ga je toch een implementatie in je subclass gaan schrijven.
Je gaat toch in je subclass niet zomaar een functie definitie gaan zetten zonder implementatie ?
En je gaat toch ook niet in je subclass een method definitie gaan zetten, terwijl de implementatie ervan in de base staat ? (Want zo kwam jouw eerste post bij mij over)

[ Voor 14% gewijzigd door whoami op 10-04-2005 11:18 ]

https://fgheysels.github.io/


Verwijderd

Erkens schreef op zondag 10 april 2005 @ 10:38:
[...]

afaik is dat niet de taak van de compiler om daarover te struikelen, doorgaands doet de linker dat :)
Eerst lezen, dan zeiken. :>

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

:?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

SH4D3H schreef op zondag 10 april 2005 @ 10:05:
Maar dat compileerde dus niet eens :(
Omdat je stdlib.h of cstdlib niet geinclude hebt waar de declaratie van system() in staat, of je compiler is stuk danwel niet standard compliant. Nu voel ik de bui al aankomen, het ligt niet aan die system() call maar aan het feit dat je een link error krijgt omdat de linker (dus niet de compiler) de implementatie van trueorfalse(int) niet kan vinden.

Met de regel
C++:
1
bool trueorfalse( int a ); 

zeg je tegen de compiler dat zo'n functie bestaat, en dat is voor de compiler voldoende om z'n werk te doen. De linker zal aan het eind de losse eindjes aan elkaar moeten knopen, en die ontdekt dat er in geen enkele sourcefile in je project, noch in een van de libraries waartegen gelinkt wordt, een functie wordt gedefinieerd die trueorfalse(int) heet.

Oplossing: implementeer trueorfalse(int) en voeg die toe aan je project. Welke conclusie kun je hier nu uit trekken: ergens in je project is die functie die je zoekt toch geimplementeerd, wellicht in sourcecode vorm, wellicht in een al gecompileerde vorm in een library. Het zal in ieder geval niet zo zijn dat hij helemaal niet bestaat, dan zal je project idd niet volledig builden.

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.

Pagina: 1