Toon posts:

[c++] Probleempje met Singleton

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb meerdere dierentuinen waar vrijkaartjes voor zijn. De class BOND is een bond die voor de uitgave en inname zorgt. En van deze bond mag er maar 1 zijn.

Ik krijg wanneer ik in dierentuin 'bond = BOND::Instance();' aanroep een error dat die BOND::instance niet kent. Wat is het probleem...moet ik hem met 'bond = BOND.Instance();' aanroepen ?

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// BOND.cc

#include "BOND.h"
#include <cstdlib> 
#include <string>
#include <ctime>
#include <assert.h>
#include <set>
#include <map>
#include <iostream> 



BOND* BOND::onlyInstance_ = NULL;

BOND* BOND::Instance(){
    if(onlyInstance_ == NULL)
        onlyInstance_ = new BOND;
    return onlyInstance_;
}

BOND::BOND(){
    vrijkaartjes = new set<long>;
    srand((unsigned)time ( 0 ));
}

long BOND::getKaartje(){
    bool goedkaartje = false;
    long kaartnummer;
    while (!goedkaartje){
        long random;
        int temp1,temp2;
        
        temp1=rand();
        temp2=rand();
        
        random= ((long)temp1<<16)|(long)temp2; 
        if (vrijkaartjes->find(random) == vrijkaartjes->end()){
            goedkaartje=true;
            kaartnummer = random;
            vrijkaartjes->insert(kaartnummer);
        }
    }
    return kaartnummer;
}

void BOND::putKaartje(long kaartje){
    if (vrijkaartjes->find(kaartje) !=  vrijkaartjes->end()){
        vrijkaartjes->erase(kaartje);
        cout << "BOND: Kaartje succesvol ingeleverd.\n";
    }else{
        cout << "BOND: Kaartje gestolen!\n";
    }
    
}


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
// BOND.h
#include <set>
#include <cstdlib>

#ifndef BOND_H
#define BOND_H
using namespace std;

class BOND {

public:
    static BOND * Instance();
    long getKaartje();
    void putKaartje(long kaartje);
protected:
    BOND();
    BOND(const BOND&);
    BOND& operator=(const BOND&);
private:
    static BOND* onlyInstance_;
    set<long> * vrijkaartjes;
};

#endif


code:
1
2
3
4
5
6
7
8
9
10
..............
private:
    /**
     * naam van de dierentuin
     */
    string      naam;

    BOND * bond;

.............


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Dierentuin.cc

#include <assert.h>
#include "BOND.h"
#include "Dierentuin.h"
#include "Dier.h"
#include "Kooi.h" 
#include "Werknemer.h"
#include <set>
#include <typeinfo>

Dierentuin::Dierentuin(string naam) {
    beschikbareDierNummers = new vector<int>;
    bond = BOND::Instance();
    beschikbareWerknemerNummers = new vector<int>;
    dieren = new map<int, Dier *>;
    kooien = new map<string, Kooi *>;
    werknemers = new map<int, Werknemer *>;
}

........en de rest van dierentuin

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10

Aangezien bond een pointer is naar het type BOND, moet je het zo aanroepen:
[code]
bond->Instance();[/code]

Hmm, ik zie nu dat Instance() een static member is (zoals het moet zijn eigenlijk).

[ Voor 32% gewijzigd door whoami op 17-11-2003 12:00 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 17 november 2003 @ 11:57:
Aangezien bond een pointer is naar het type BOND, moet je het zo aanroepen:
code:
1
bond->Instance();
Binnen de constuctor van dierentuin??

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
whoami schreef op 17 november 2003 @ 11:57:
Aangezien bond een pointer is naar het type BOND, moet je het zo aanroepen:
code:
1
bond->Instance();
bond is een pointer die nog niet ge-init is en Instance() is een static methode. Dan lijkt me de door de TS aangedragen manier toch wel goed. Ik heb alleen geen idee waarom het hier mis gaat. Het ziet er allemaal goed uit.

Verwijderd

Topicstarter
dit geeft hij precies

md@skool:~/c++/praktikum/c++/opdracht_BOND$ make
g++ -c Dierentuin.cc
g++ -o dierentuin Main.o Dierentuin.o Dier.o Werknemer.o Kooi.o
Undefined first referenced
symbol in file
BOND::Instance(void) Dierentuin.o
ld: fatal: Symbol referencing errors. No output written to dierentuin
collect2: ld returned 1 exit status
make: *** [dierentuin] Error 1
md@skool:~/c++/praktikum/c++/opdracht_BOND$

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

g++ -o dierentuin Main.o Dierentuin.o Dier.o Werknemer.o Kooi.o
Undefined first referenced
symbol in file
BOND::Instance(void) Dierentuin.o
Ik zie Bond.o daar niet in het lijstje staan

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.


Verwijderd

Topicstarter
.oisyn schreef op 17 november 2003 @ 12:14:
[...]


Ik zie Bond.o daar niet in het lijstje staan
Nu wel maar....:( geeft ie de error


md@skool:~/c++/praktikum/c++/opdracht_BOND$ make
', needed by `Main.o'. Stop.get `Dierentuin.h
md@skool:~/c++/praktikum/c++/opdracht_BOND$


de makefile

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
OBJECTS=Main.o Dierentuin.o Dier.o Werknemer.o Kooi.o BOND.o
dierentuin: $(OBJECTS)
    g++ -o dierentuin $(OBJECTS)
Main.o : Main.cc Dierentuin.h
    g++ -c Main.cc
Dierentuin.o : Dierentuin.cc Dierentuin.h Dier.h Werknemer.h
    g++ -c Dierentuin.cc
Dier.o : Dier.cc Dier.h
    g++ -c Dier.cc
Werknemer.o : Werknemer.cc Werknemer.h
    g++ -c Werknemer.cc
Kooi.o : Kooi.cc Kooi.h Dier.h
    g++ -c Kooi.cc
BOND.o : BOND.cc BOND.h
    g++ -c BOND.cc

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

:?
Doe het eens met de hand (en niet via make), want dit is wel een hele vage error

[ Voor 50% gewijzigd door .oisyn op 17-11-2003 12:34 ]

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.


Verwijderd

Topicstarter
.oisyn schreef op 17 november 2003 @ 12:34:
:?
Doe het eens met de hand (en niet via make), want dit is wel een hele vage error
Hoe met de hand, altijd gedaan met make?

g++ -c BOND.cc ?? op die manier maakt die BOND.o aan. Maar vervolgens doe ik weer make en krijg ik die error waardoor ik dit topic starte.

Verwijderd

Topicstarter
Ik heb nu het idee dat het dus niet ligt aan de makefile want BOND.o is gecompileerd.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Nu wel maar....:( geeft ie de error

md@skool:~/c++/praktikum/c++/opdracht_BOND$ make
', needed by `Main.o'. Stop.get `Dierentuin.h
md@skool:~/c++/praktikum/c++/opdracht_BOND$
Kijk je makefile eens na op extra spaties aan het einde van de regels. En let er op dat het inspringen bij een makefile met 1 tab moet gebeuren en geen spaties. Ik gok dat er achter dierentuin.h een spatie staat.

Make is erg gevoelig voor de layout van de makefile.

"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


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 13:30

BoAC

Memento mori

Verwijderd schreef op 17 november 2003 @ 12:40:
[...]


Hoe met de hand, altijd gedaan met make?

g++ -c BOND.cc ?? op die manier maakt die BOND.o aan. Maar vervolgens doe ik weer make en krijg ik die error waardoor ik dit topic starte.
En welke error krijg je dan als je na BOND.o:
code:
1
g++ -o dierentuin Main.o Dierentuin.o Dier.o Werknemer.o Kooi.o BOND.o

uitvoert?

Verwijderd

Topicstarter
Topic kan dicht. Het werkt.

Bedankt allemaal.

Het probleem was dat als ik een makefile op winxp aanpaste en uploade hij die vreemde melding gaf met die komma.

Nu de makefile geedit in vi en het werkt :)

  • ranzige pad
  • Registratie: Februari 2000
  • Laatst online: 17-08 15:20

ranzige pad

kwaaak kwaak

leuk z'n hogeschool enschede probleem :-)

HT & NAS & Inventaris


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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 17 november 2003 @ 12:40:
g++ -c BOND.cc ?? op die manier maakt die BOND.o aan. Maar vervolgens doe ik weer make en krijg ik die error waardoor ik dit topic starte.
ja, en daarna dus die link regel, en niet via make, en dan werkt het wel. Dat probeerde ik dus uit te sluiten :)

Maar goed, je hebt je oplossing al (het was idd make dat fout ging, niet je code, wat ik al dacht)

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.


Verwijderd

Topicstarter
ranzige_pad schreef op 17 november 2003 @ 13:01:
leuk z'n hogeschool enschede probleem :-)
Ja :) erg fijn zoiets weer.

Verwijderd

Topicstarter
.oisyn schreef op 17 november 2003 @ 17:04:
[...]


ja, en daarna dus die link regel, en niet via make, en dan werkt het wel. Dat probeerde ik dus uit te sluiten :)

Maar goed, je hebt je oplossing al (het was idd make dat fout ging, niet je code, wat ik al dacht)
Ja ik vond het ook al raar :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 16-08 21:36
Er zitten wel een fors aantal fouten nog in, voornamelijk wegens pointer misbruik. Zo zijn bjvoorbeels alle new's fout gebruikt. Tip: je hebt er geen een nodig, dus in plaats van de new's te fixen kun je ze ook vermijden.

Bovendien bewaar je een pointer naar een BOND als member. Dat is onzinnig, als je die pointer later nodig hebt haal je'm net zo makkelijk opnieuw op. In pattern termen, de functie Instance() is 'the single point of access to the unqiue object', en jij dupliceert het point of access (alhoewel niet het feitelijke object).

Als laatste stijlopmerking zou ik willen vermelden dat 'using namespace std' in jouw code jouw keus is, maar leg dat niet aan anderen op. Een gebruiker van bond.h moet dus ::set zelf kunnen gebruiken, zonder dat jij daar std::set overheen knalt. Daarom is 'using namespace N' of zelfs 'using X::Y' in headers iha een slecht idee.

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

Pagina: 1