[C++] Singleton object: wat doe ik fout?

Pagina: 1
Acties:

  • hellfire_ultd
  • Registratie: April 2001
  • Laatst online: 20-11-2025
Ik probeer in C++ een singleton object te implementeren. Als ik mijn programma probeer te compileren krijg ik tijdens het linken de volgende foutmelding: (ik heb g++ 2.95 en 3.2 geprobeerd)

code:
1
2
3
4
5
6
7
$ g++ main.cpp -c
$ g++ main.o
main.o: In function `cApplication::getInstance(void)':
main.o(.text+0x39): undefined reference to `cApplication::instance'
main.o(.text+0x68): undefined reference to `cApplication::instance'
main.o(.text+0x92): undefined reference to `cApplication::instance'
collect2: ld returned 1 exit status


Ik heb gezocht, maar ik zie echt geen fouten zitten in het programma. Of is dit een typische "feature" van gcc?

main.h:
code:
1
2
3
4
5
6
7
8
9
10
class cApplication {
    
public:
    int run(int, char**);
    static cApplication* getInstance();
private:
    static cApplication* _instance;
protected:
    cApplication();
};


main.cpp:
code:
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
#include <stdio.h>
#include "main.h"

cApplication::cApplication() {
}

int cApplication::run(int argc, char* argv[]) {
    printf("Hello, World!\n");
    
    return 0;
}

cApplication* cApplication::getInstance() {
    if(cApplication::_instance==NULL) {
        cApplication::_instance=new(cApplication);
    }
    
    return cApplication::_instance;
}

int main(int argc, char* argv[]) {
    cApplication* application=cApplication::getInstance();
    
    return application->run(argc,argv);
}


Ik heb uiteraard al op pagina's zoals http://www.informit.com/g...sp?g=cplusplus&seqNum=145 gekeken, maar de implementaties die daar staan lijken vrijwel exact op die van mij. :?

[ Voor 10% gewijzigd door hellfire_ultd op 17-04-2004 19:23 ]


  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 00:23
moet je je instance niet eerst op NULL zetten?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Hij klaagt over instance en niet _instance, ik denk dus dat je ergens een underscore bent vergeten? Je kan eigenlijk beter een underscore achter je namen zetten oid. Identifiers die beginnen met een underscore en gevolgd worden door een hoofdletter zijn namelijk gereserveerd.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

oh wacht, het is een linker error. Nee je hebt nu alleen die static instance gedeclareerd, maar niet gedefineerd. Je moet in je .cpp nog even static xx::instance = NULL; zetten.

  • hellfire_ultd
  • Registratie: April 2001
  • Laatst online: 20-11-2025
Bedankt, dat helpt. Het werkt nu!

Ik heb de volgende regel toegevoegd:
code:
1
cApplication* cApplication::_instance=NULL;


edit:
overigens had ik die underscore toegevoegd omdat een van de oplossingen aangeboden op internet die ook had. Maar die bleek niet nodig te zijn, en is dus weg. Ik hou niet zo van underscores in namen van variabelen. ;)

[ Voor 48% gewijzigd door hellfire_ultd op 17-04-2004 19:47 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Bugje; je lekt een cApplication object. new zonder delete, dus dat gaat fout. De oplossing is simpel: gebruik een std::auto_ptr<cApplication> in plaats van een domme pointer.

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Je mag overigens ook gewoon 0 gerbuiken ipv NULL.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 16-02 16:12
farlane schreef op 19 april 2004 @ 09:43:
Je mag overigens ook gewoon 0 gerbuiken ipv NULL.
Euhm... Ik heb geleerd om voor pointers altijd NULL te gebruiken, om verwarring met integers (e.d.) te voorkomen.

Oftewel: het *kan* wel, maar het is (imo) minder netjes.

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Dat was C. In C++ is de type-safety aangescherpt, waardoor de NULL macro overbodig is geworden. In het bijzonder: In C mocht NULL nog een pointer zijn, maar in C++ is NULL nooit een pointer. Het moet altijd een integer 0 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


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik gebruik ook altijd NULL. Als je 0 gebruikt, lijkt het net of het ook 1 mag zijn. Integer 0 gebruiken ipv NULL vind ik eigenlijk net zoiets als 0 of 1 gebruiken ipv false/true. De compiler zal het verder niets uitmaken, qua leesbaarheid vind ik NULL gewoon beter. Je ziet dan ook meteen dat het om een pointer gaat, en niet bv een reference counter oid.

Verwijderd

In C++ is 0 de "universal initializer", er wordt gegaranderd dat je alle builtin types met 0 initialiseren kunt, inclusief pointers naar (member) functies; tevens kun je 0 gebruiken om complete POD structs en arrays te initialiseren:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
struct blah {
    char   naam[10];
    int    x;
    bool   y;
    double z;
    blah*  next;
};

...

blah b= { 0 }; // alle velden op "null"
bool flags[1000]= 0; // alle bools in de array op false


NULL heeft als nadeel dat hij anders gedefinieerd moet zijn in C als in C++; in C is hij meestal gedefinieerd als ((void*)0), terwijl dat in C++ typeconversie fouten zou geven bij zaken als "blah* b= NULL;". NULL gebruiken is dus riskant, afhankelijk van de headerfile die je include kan het fout gaan.

[ Voor 6% gewijzigd door Verwijderd op 19-04-2004 14:39 . Reden: typo ]

Pagina: 1