[C++] Class extends link error

Pagina: 1
Acties:
  • 167 views

Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Ik heb zelf een thread class gemaakt om makkelijk threaded applicaties te kunnen schrijven. Maar het extenden van deze class wil nog niet helemaal lukken.

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
25
26
27
28
29
30
31
class vdsock_thread{
    public:
        vdsock_thread(){}

        int start(void* _arg){
            arg(_arg);
            int code = pthread_create(&_thread_id, NULL, &vdsock_thread::entry_point, this);
            return code;
        }
    
    protected:
        int run(void* arg){
            setup();
            execute(arg);
        }
        
        static void* entry_point(void* pthis){
            vdsock_thread* pt = (vdsock_thread*)pthis;
            pt->run(pt->arg());
        }
        
        void* arg() const{ return _arg; }
        void arg(void* a){ _arg = a; }
        
        virtual void setup();
        virtual void execute(void*);
    
    private:
        pthread_t _thread_id;
        void* _arg;
};


Bij de volgende extend gaat het mis:
C++:
1
2
3
4
5
6
7
8
9
10
class A : public vdsock_thread{
    public:
        void execute(void* arg){
            std::cout << "Thread 1!\n";
            usleep(1000000);
            std::cout << "Thread 1 again!\n";
            usleep(1000000);
        }
        void setup(){}
};


Ik gebruik hem zo:
C++:
1
2
A t;
t.start(NULL);


Dit is de fout melding:
/tmp/ccWjIeT2.o: In function `vdsock_thread::vdsock_thread()':
t.cpp:(.text._ZN13vdsock_threadC1Ev[vdsock_thread::vdsock_thread()]+0x8): undefined reference to `vtable for vdsock_thread'
collect2: ld gaf exit-status 1 terug

Snapt iemand wat ik fout doe?

Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Beruchte onhandige boodschap van de linker.. je kan er op de volgende link meer over lezen:

http://gcc.gnu.org/faq.html#vtables

[ Voor 4% gewijzigd door Stukfruit op 04-02-2009 23:18 ]

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • vdvleon
  • Registratie: Januari 2008
  • Laatst online: 08-06-2023
Dankje wel!

Wat een rare fout. Maar simpel opgelost:

C++:
1
2
virtual void setup();
virtual void execute(void*);


vervagen voor:

C++:
1
2
virtual void setup(){};
virtual void execute(void*){};

Acties:
  • 0 Henk 'm!

  • Stukfruit
  • Registratie: Oktober 2007
  • Niet online
Je kan ze ook pure virtual maken he? :)

C++:
1
2
virtual void setup() = 0;
virtual void execute(void*) = 0;

Dat zit wel Schnorr.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nou, het ontbreekt je in ieder geval duidelijk aan Google skills want de eerste de beste hit die ik aantrof verwijst naar exact hetzelfde document al Stukfruit aandraagt.

We zeggen dit niet voor het eerst, maar ik blijf het niet tot in den treure herhalen: het is hier wél de bedoeling dat je een beetje moeite doet voordat je een topic opent. De foutmelding even googlen en even 2 minuten nemen om de zoekresultaten eens aandachtig te bekijken en wat verder te lezen dan je neus lang is valt daar dus ook onder.

Trouwens; het kan geen kwaad zo nu en dan ook eens proberen een ander te helpen. We zijn geen helpdesk waar je lekker je kant-en-klare antwoordjes kunt komen halen; als je regelmatig iets vraagt van de community is het wel zo netjes (hoewel ik erbij moet vermelden: niet 'verplicht') om zo nu en dan eens wat terug te doen.

[ Voor 20% gewijzigd door RobIII op 05-02-2009 01:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Dit topic is gesloten.