Toon posts:

[C++] Functie pointers

Pagina: 1
Acties:
  • 29 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik ben gister en vandaag de hele dag bezig geweest met pointers naar memberfuncties mbv van een guide. Ik had het helemaal zo geklopt zoals ik dacht dat het moet in mijn programma. Maar toen ik hem aanriep kreeg ik een paar errors waar ik helemaal niets van snapte. Omdat ik ze niet opgelost kreeg heb ik maar even snel een nieuw project gemaakt (in visual c++ 6.0) en daar even een zeer vereenvoudige versie van hoe ik dahct dat het zou moeten werken. Alleen wat krijg ik daar precies dezelfde error als bij mijn volledige programma.
Zou ik iets hebben vergeten aan te zetten/includen?

Error
code:
1
2
3
4
5
6
7
8
9
10
--------------------Configuration: testfunctionpointer - Win32 Debug--------------------
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall TMyClass::~TMyClass(void)" (??1TMyClass@@UAE@XZ)
main.obj : error LNK2001: unresolved external symbol "public: __thiscall TMyClass::TMyClass(void)" (??0TMyClass@@QAE@XZ)
Debug/testfunctionpointer.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

testfunctionpointer.exe - 3 error(s), 0 warning(s)


Main.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream.h>
#include "TMyClass.h"

int main(int argc, char* argv[])
{
    float (TMyClass::*pt2Member)(float,char,char);
    TMyClass tmc;
    pt2Member = &TMyClass::DoIt;
    cout << (tmc.*pt2Member)(12,'a','b') << endl;

    return 0;
}


TMyClass.h
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
#ifndef _TMYCLASS_H_
#define _TMYCLASS_H_

class TMyClass
{
public:
    TMyClass();
    virtual ~TMyClass();    
    float DoIt (float a, char b,  char c) 
    { 
        cout << "TmYClass::DoIt" << endl; 
        return a+b+c;
    }

    float DoMore (float a, char b,  char c) 
    { 
        cout << "TMyClass::DoMore" << endl; 
        return a-b-c;
    }

private:
};

#endif

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je hebt je constructor en destructor niet geimplementeerd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass()
{
    public:
        MyClass();
        ~MyClass();
}

MyClass::MyClass()
{
   // constr. code
}

MyClass::~MyClass()
{
    // destr.
}


Trouwens, ik zie niet direct het nut in van een virtuele destructor?

[ Voor 72% gewijzigd door .oisyn op 09-01-2004 16:45 ]

https://fgheysels.github.io/


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Base
{
public:
  Base () {}
  ~Base () {}
};

class Inherit : public Base
{
private:
  char *list; 
public:
  Inherit (int length) {list = new char(length);}
  ~Inherit () {delete list;}
};

// ergens zet je dit:
Base *base = new Inherit (5);

delete base;


de list zal niet gecleared worden indien de destructor van base niet virtueel is.
maar ik heb een vermoeden dat je dit al weet.

(indien code niet helemaal correct: goed mogelijk, ik heb het niet gecheckt,
maar de constructie is duidelijk)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

whoami schreef op 09 januari 2004 @ 13:04:
Trouwens, ik zie niet direct het nut in van een virtuele destructor?
Iets duidelijker dan schoene: zodra je een method virtual maakt zullen overloads in alle afgeleide classes automatisch ook virtual zijn, en dit geldt hetzelfde voor een destructor. Door in een base-class een lege virtual destructor te introduceren dwing je dus af dat alle afgeleiden ook automatisch een virtual destructor hebben.

In code dus:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A
{
public:  void DoeIets();   // Niet virtual
};

class B : public A
{
public:  virtual void DoeIets();   // Wel virtual
};

class C : public B
{
public:  void DoeIets();   // Wel virtual (!!!)
};

[ Voor 2% gewijzigd door .oisyn op 09-01-2004 16:45 ]

Professionele website nodig?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
yep, ik twijfelde nog om dat erbij te vermelden. had het idd beter wel gedaan. tnx voor de aanvulling :7

Verwijderd

Topicstarter
offtopic:
God, want een ongelofelijke stomme fout van mijn, die in de categorie "doodstaren" zit.


IIG hardstikke bedankt.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

nou heb je nog steeds het nut ervan niet uitgelegd :)

Een virtual destructor is bijna essentieel als je je klasse ooit gaat overerven. Stel A is een base van B, en je hebt een pointer naar A, als je die A dan delete, dan moet de destructor van B natuurlijk ook aangeroepen worden. Dit kan echter alleen maar als de destructor van A virtual is. In plaats van de destructor van A aan te roepen wordt dan de destructor van B aangeroepen (die op zijn beurt weer de destructor van A aanroept), en zo zorg je er dus voor dat een object dus niet maar half opgeruimd wordt oid

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.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Nou, ik ken het nut en doel wel van virtual functions enzo hoor; ik zag alleen niet direct het nut in van een virtual destructor, maar nu wel. :)

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

.oisyn schreef op 09 januari 2004 @ 15:54:
[...]
nou heb je nog steeds het nut ervan niet uitgelegd :)
Ik meende te begrijpen dat ie naar het nut vroeg van een lege virtual destructor :X

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
curry684 schreef op 09 januari 2004 @ 16:06:
[...]

Ik meende te begrijpen dat ie naar het nut vroeg van een lege virtual destructor :X
Als ie leeg is in de base class, wil het toch niet zeggen dat ie leeg is een concrete class.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 09 januari 2004 @ 16:06:
[...]

Ik meende te begrijpen dat ie naar het nut vroeg van een lege virtual destructor :X
le-zen :P
whoami schreef op 09 januari 2004 @ 13:04:
Trouwens, ik zie niet direct het nut in van een virtuele destructor?

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: 12-05 22:23

curry684

left part of the evil twins

Idd, je had gelijk, ik was best wel dom

[ Voor 87% gewijzigd door .oisyn op 09-01-2004 16:45 ]

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

:P

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: 12-05 22:23

curry684

left part of the evil twins

.oisyn wijzigde dit bericht 09-01-2004 16:45 (87%)
Dat is al actie 2 vandaag die je niet met mensen met banrechten moet uithalen. Ooit gehoord van het concept "3 strikes and you're out"? :P

Professionele website nodig?


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:36
conclusie: mijn voorbeeld alleen was waarschijnlijk toch genoeg :+

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Conclusie: dit kan wel dicht.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.