c++ object name in variable

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Hallo,

Ik heb een klein probleempje, ik zal eerst even zeggen wat ik aan het doen ben:
ik heb een c++ class met daar in spelers. Omdat er maar 3 spelers zijn en jij daar 1 van bent heb ik 3 standaard object namengebruikt:

a //tegenstander1
b //tegenstander2
y //dat ben je zelf

Ik heb in een bepaald stuk de object naam in een variable, dit omdat ik niet steeds wil kijken met if wat de speler naam is. dus:

code:
1
tegenstander = 'a';


Dat is de variabel met de naam er in.

Ik wil informatie van de tegenstander opvragen, ik dacht dat dat zo kon:
code:
1
cout << (tegenstander).getx(); //voor de x cordinaten van de tegenstander


Dit bleek niet te werken, ik heb een aantal andere combinaties geprobeerd:

code:
1
cout <<  ((tegenstander).getx());


Toen toverde ik dit ergens vandaan:

code:
1
(tegenstander)::getaid();


Dit had allenmaal geen resultaat

Hij ziet niet dat ik de autoput van tegenstander aan .getx() wil vast plakken
Hij geeft aan dat getx niet declared is.

code:
1
2
450 C:\Users\bsstage1\Desktop\rpg 023b.cpp `getx' has not been declared 
450 C:\Users\bsstage1\Desktop\rpg 023b.cpp request for member of non-aggregate type before '(' token


Toen dacht ik, ik zal maar gaan google iemand anders zal vast en zeker wel dit probleem gehad hebben.
Alleen toen dacht ik, wat voor zoekterm zou ik hier voor kunnen gebruiken.

Variable object name class c++

Toen kreeg ik deze sites:
http://php.net/manual/en/language.oop5.php <<over php maar dit ging over een nieuwe class maken
http://www.cplusplus.com/doc/tutorial/classes/ << class tutorial alleen ik vond er niks in
etc
etc

"name" "object" in "Variable" class c++
Weer niks

Ik heb nog velen andere zoektermen gebruik, maar helaas niks gevonden,

Toen dacht ik, ik zal eens gaan kijken als het met een pointer kan, alleen het probleem zal er weer zijn dat hij niet ziet wat ik bedoel.

Dus zou iemand weten hoe ik toegang tot een class kan krijgen met een variable waar de object name in zit?
Ben al meer als een uur op zo iets simpels aan het zoeken :$ (schaam schaam)


Edit:
Ik gebruik dus bvb:
//werkt niet:
tegenstander = 'y';
cout << (tegenstander).getaid();

//werkt:
cout << y.getaid();

[ Voor 3% gewijzigd door lauwsa op 28-10-2010 13:50 ]


Acties:
  • 0 Henk 'm!

Anoniem: 42901

Hoe ziet die class er uit? (members enzo)
Waar heb je getx() gedeclareerd?

Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Ow sorry, hier heb je de informatie:

Dit is de class speler:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class speler {
      private:
                int wapenid; //idnummer van zijn wapen
                int armoreid; //id nummer van zijn armore
                int x; //x cordinaat van de speler
                int y; //y cordinaat van de speler
                int health; //health van de speler
      public:    
                int getwid() { return wapenid; } //laat armore id zien
                int getaid() { return armoreid; } //laat wapen id zien
                int getx() { return x; } //output de x cordinaat van de speler
                int gety() { return y; } //out put de y cordinaat van de speler
                int gethealth() { return health; } //output de healtg
                int setx(int p_x) { x = p_x; } //maakt de x cordienaat de input
                int sety(int p_y) { y = p_y; } //maakt de y cordienaat de input
                int sethealth(int shealth) { health = shealth; }
                speler(); //zet de cordinaten en health van de speler
                speler(int s_x,int s_y, int s_health); //zet de cordinaten en health van de speler die doorgegeven word
                int nieuwe_cordinaten(); //genereerd nieuwe cordinaten voor die speler
};


Edit: let niet op me spelfouten, en vooral niet in me cometaar. Dit moet ik allenmaal nog verbeteren
Edit2: de na zijn, was een te erge fout

[ Voor 4% gewijzigd door lauwsa op 28-10-2010 13:54 ]


Acties:
  • 0 Henk 'm!

Anoniem: 42901

Heb je de speler class ook geinclude in "rpg 023b.cpp"? Of staat die in deze cpp gedeclareerd?
Wat voor type is 'tegenstander'?

[ Voor 15% gewijzigd door Anoniem: 42901 op 28-10-2010 14:02 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hebt een variabele naar een string ( of char ), daar kun je natuurlijk geen methodes op aan roepen die in het type Speler zitten.

Je zult dus moeten zorgen dat je op de een of andere manier een (pointer/reference naar) speler te pakken krijgt.

Je zult dus ergens een collectie van Spelers bij moeten houden, die je op de een of andere manier ( Bijvoorbeeld met je char ) indexeert.
lauwsa schreef op donderdag 28 oktober 2010 @ 13:47:
Dus zou iemand weten hoe ik toegang tot een class kan krijgen met een variable waar de object name in zit?
Ben al meer als een uur op zo iets simpels aan het zoeken :$ (schaam schaam)
Van een string kun je niet opeens naar een Speler casten, want dat Speler object zal ergens opgeslagen moeten zijn, en dus zul je zelf moeten zorgen dat je daar weer bij kan ( eventueel aan de hand van je string/char ). Als je later iets aan de hand van een key op wil zoeken kun je het best kijken naar bijvoorbeeld een map/dictionary.

[ Voor 44% gewijzigd door Woy op 28-10-2010 14:05 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
C++ is geen "losse" taal als Javascript of PHP; wat jij wilt "kan niet" in C++. (tussen haakjes omdat het vast wel op een of andere slordige manier wel kan)

Ik raad je aan een class te maken en vervolgens 3 instances te maken van die class, Waarschijnlijk hebben de "enemy" en "player" afwijkende eigenschappen, dus als je dat netjes wilt doen zal je tenminste 3 classes moeten schrijven; 1 "root" class met alle overeenkomsten en 2 subclasses met de unieke eigenschappen; 1 voor de speler en 1 voor de enemy.

Je krijgt dan bijv. de volgende code:
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
32
33
34
// de root class
class Entity
{
private:
  double x;
  double y;
public:
  virtual double getX();
  virtual double getY();
  virtual bool isAlive();
};

// De enemy-class
class Enemy : public Entity
{
public:
  // voeg extra methods toe die alleen Enemies kunnen, zoals methods voor een AI controller
};

// De player-class
class Player : public Entity
{
public:
  // voeg extra methods toe voor de input van de user om de speler te besturen.
}

Player player1();
Enemy enemy1();
Enemy enemy2();

// Een pointer naar een Entity, die naar iedere instances van Entity en zijn subclasses kan verwijzen.
Entity * entity;
entity = &player1; // entity verwijst nu naar player1
entity = &enemy1; // entity verwijst nu naar enemy1


Als je een method van een object wil gebruiken vanaf een pointer, zoals "entity" in het bovenstaande voorbeeld, moet je de "->" operator gebruiken i.p.v. de gebruikelijke ".". Voorbeeld:

C++:
1
std::cout << entity->getX() << "\n";


Echter, zelf ben ik ook nog maar een beginner met C++, maar ik kan je vertellen dat C++ een erg pittige taal is als je enkel PHP/javascript kent. Ik zelf raad je aan eerst met C# of Java te beginnen als tussenstap richting C++. C++ is sowieso geen prettige taal om gewoon mee rond te spelen; prototypes voor simpele games maken in Java/C#/PHP/Javascript werkt veel prettiger.

Verder raad ik je sterk aan je eens te verdiepen in OOP. Niet persee in C++; OOP leren in C#/Java lijkt mij het beste. Pak een goede OOP tutorial, lees 'm een paar keer goed door op een rustig middagje. Nogmaals, de taal waarin je OOP leert is niet echt van belang. OOP is niets meer dan een programmeer-style die je in vrijwel iedere taal kunt toepassen.

OOP i.c.m. Java:
> http://download.oracle.com/javase/tutorial/java/concepts/

Java wordt door velen als een vervelende omgeving ervaren, maar persoonlijk vind ik het een hele goede omgeving om OOP te leren.

C++ algemeen en classes i.c.m. C++
(je leert hier geen OOP, je leert hier classes gebruiken, wat erg handig is i.c.m. OOP)
> http://www.cplusplus.com/doc/tutorial/introduction/

[ Voor 16% gewijzigd door Gamebuster op 28-10-2010 14:14 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Je kunt natuurlijk niet zomaar een char ineens benaderen als een klass van het type 'speler' . Dat is wat ik hier zie wat je aan het doen bent.

C:
1
tegenstander = 'a';


Van welk type is 'tegenstander'?

edit: spuit 764331...........

[ Voor 6% gewijzigd door EddoH op 28-10-2010 14:05 ]


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Op het moment heb ik het nog in rpg 023b.cpp staan, dit is snel een klein projectje om te kijken hoe ik het kan maken. De class ga ik binnen kort verplaatsen.

Maar:

Ik gebruik bvb dit:
//werkt niet:
tegenstander = 'y';
cout << (tegenstander).getaid();

//werkt:
cout << y.getaid();

Dus de class werkt. (anders zou het onderste deel het niet doet)


Edit:
ben nu de bovenste berichten aan het lezen.

[ Voor 7% gewijzigd door lauwsa op 28-10-2010 14:06 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Een char met de value 'y' is heel wat anders dan het label ( variabele ) y wat jij gebruikt. Je kunt niet zomaar een string of char gebruiken om te refereren naar een variabele. Na het compileren bestaat dat label helemaal niet meer. Het is dan ook alleen een hulpmiddel om de compiler duidelijk te maken welk stukje geheugen hij moet gebruiken om een bepaald object (pointer) op te zoeken.

Je kunt dus ook niet met een runtime waarde naar dat label verwijzen. Als je dat wel wil, zul je die informatie eerst ergens op moeten slaan in een collectie. Voor een key/value pair is een map het meest voor de hand liggend

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Comp_Lex
  • Registratie: Juni 2005
  • Laatst online: 19:29
Je kunt ook met een switch-case constructie de spelernamen checken.

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Comp_Lex schreef op donderdag 28 oktober 2010 @ 14:18:
Je kunt ook met een switch-case constructie de spelernamen checken.
Laten we het even beperken tot goede adviezen.... 8)7

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
lauwsa schreef op donderdag 28 oktober 2010 @ 14:04:
Op het moment heb ik het nog in rpg 023b.cpp staan, dit is snel een klein projectje om te kijken hoe ik het kan maken. De class ga ik binnen kort verplaatsen.

Maar:

Ik gebruik bvb dit:
//werkt niet:
tegenstander = 'y';
cout << (tegenstander).getaid();

//werkt:
cout << y.getaid();

Dus de class werkt. (anders zou het onderste deel het niet doet)


Edit:
ben nu de bovenste berichten aan het lezen.
In PHP en Javascript (en vele andere losse talen) worden variable-namen bewaard, zelfs tijdens het uitvoeren van het script. In die talen is het daarom mogelijk de data in variablen op te halen via een variable-naam als tekenreeks.

In C++ worden de variable namen niet bewaard. De class-names worden niet eens bewaard. Wanneer jij op "build" klikt zijn alle variable- en classnames al "vergeten"; die worden niet meegegeven in de machine-code. Dat is ook de rede dat er geen "eval" functie is in C++ en wel in PHP/Javascript; het is simpelweg niet mogelijk in C++.

Zoals ik hierboven zie, ga lekker Java/C# doen. Veel makkelijker en kan nog steeds erg snel zijn. Als je 1 van die 2 talen goed beheert kan je daarna langzaam overgaan op C++. Ik denk dat erg weinig C++ programmeurs hier begonnen zijn met C++ zonder eerst tenminste C#/Java gekend te hebben, of ze hadden een opleiding/cursus die ze rustig volgden.

[ Voor 13% gewijzigd door Gamebuster op 28-10-2010 14:28 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
ahh vandaar,

@ Woy:
dus ik moet eigelijk de pointers van allen spelers opslaan in bvb een file, en dan kan ik hier uit aflijden welken pointer bij welke speler hoort. Dus ik zal mappen/files moeten gaan maken om alles in op te slaan.

Dat word dus een heel groot deel opnieuw schijven ;) haha

@ Gamebuster
De tegenstanders en je zelf kunnen nu nog het zelfde, maar dat klopt idd als ik het later ga uitberijden zal het goed mogelijk zijn dat dat zal kunnen.

Ik zal dus mijn classes opnieuw moeten gaan maken ;)
thanks!

Edit:
@Woy
Dus als je het programma rund bestaat y niet meer, en kan ik dus ook niet meer via het label bij de class komen.
Dat verklaard heel erg veel. Pointers blijven dus wel bewaard, bedankt :D, dus met mappen en files gaan werken is de beste oplossing.

@Comp_Lex
Dat lijkt me niet leuk als je te veel spelers hebt :P haha

@Gamebuster
Ik vind het leuk om dit soort dingen uit te vinden en er van te leren, ik ken een heel klein beetje php, vroeger heb ik echt te veel in mirc gedaan.

Ik heb 2 boeken van c++ gelezen alleen dit soort dingen komen er niet echt in voor, of je denk er niet goed bij na als je het leest.

Bedankt iedereen voor jullie informatie :D
Thanks

[ Voor 40% gewijzigd door lauwsa op 28-10-2010 14:37 ]


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

lauwsa schreef op donderdag 28 oktober 2010 @ 14:31:
ahh vandaar,

@ Woy:
dus ik moet eigelijk de pointers van allen spelers opslaan in bvb een file, en dan kan ik hier uit aflijden welken pointer bij welke speler hoort. Dus ik zal mappen/files moeten gaan maken om alles in op te slaan.
......
Edit:
@Woy
Dus als je het programma rund bestaat y niet meer, en kan ik dus ook niet meer via het label bij de class komen.
Dat verklaard heel erg veel. Pointers blijven dus wel bewaard, bedankt :D, dus met mappen en files gaan werken is de beste oplossing.
Pointers opslaan in een file?! alsjeblieft niet!
Een pointer is het geheugenadres dat een object heeft na creatie, oftwewel waar in het werkgeheugen de data zich bevindt. Dit veranderd dus elke keer dat een programma runt.

Kun je wat beter beschrijven wat je nu wilt gaan doen? WIl je namen van spelers opslaan? Of iets anders, het wordt me namelijk niet duidelijk wat je doel nu precies is.

Acties:
  • 0 Henk 'm!

Anoniem: 187672

lauwsa schreef op donderdag 28 oktober 2010 @ 14:31:
dus ik moet eigelijk de pointers van allen spelers opslaan in bvb een file, en dan kan ik hier uit aflijden welken pointer bij welke speler hoort. Dus ik zal mappen/files moeten gaan maken om alles in op te slaan.

Dat verklaard heel erg veel. Pointers blijven dus wel bewaard, bedankt :D, dus met mappen en files gaan werken is de beste oplossing.
Waardoor denk je nu dat je de pointers moet opslaan in een file?

Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
De naam van de pointer opslaan bij de files van de user, dus idd niet het address. Sorry zei het verkeerd.

Edit: of zijn die ook weg. (na het even nadenken denk ik dat die ook weg moeten zijn :P )
Dan kan ik beter allen info over een user opslaan in files.

En dan een index maken met allen spelers er in, alleen hoe moet ik nog gaan uitzoeken. (index van de pointers)

[ Voor 60% gewijzigd door lauwsa op 28-10-2010 14:45 ]


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

...De naam van de pointer??
Ku nje nu even precies aangeven welke functionaliteit je probeert te maken?
probeer je spelers op te slaan of instanties van spelers te benaderen 'by name' ?

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
EddoH schreef op donderdag 28 oktober 2010 @ 14:40:
[...]


Pointers opslaan in een file?! alsjeblieft niet!
Een pointer is het geheugenadres dat een object heeft na creatie, oftwewel waar in het werkgeheugen de data zich bevindt. Dit veranderd dus elke keer dat een programma runt.

Kun je wat beter beschrijven wat je nu wilt gaan doen? WIl je namen van spelers opslaan? Of iets anders, het wordt me namelijk niet duidelijk wat je doel nu precies is.
Hij heeft 3 variablen:
a
b
y

In "a" en "b" staan objecten van een class die een tegenstander voorstellen. (de exact class heeft hij hier niet vermeldt) In "y" staat een object van het type "speler". De classes van de objecten zijn verder niet gerelateerd (geen inheritance of superclass die ze delen).

Hij wilt vervolgens de objecten in deze variables ophalen op basis van een tekenreeks; als hij de tekenreeks "a" heeft, dan moet de C++ runtime (die er niet is) het object in variable "a" ophalen, wat dus niet kan in C++, maar wel in PHP of Javascript.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Player
{
private $x = 0;
public function getX() {return $this->x;}
}

class Enemy
{
private $x = 1;
public function getX() {return $this->x;}
}
$a = new Enemy();
$b = new Enemy();
$y = new Player();

$varname = "a";

echo ($$varname)->getX(); // output: 1


Hij wilt een C++ versie van de bovenstaande code uitvoeren dus. In PHP kan dit prima, in C++ is dit niet mogelijk.

@ gamebuster: zo ver was ik ook al.

De TS begint alleen over het opslaan van data in mappen en files. De relevantie daarvan mis ik even in deze context.


Owja, ik moet eens wat meer lezen en wat minder typen.

[ Voor 13% gewijzigd door Gamebuster op 28-10-2010 15:00 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

@ gamebuster: zo ver was ik ook al.
De TS begint alleen over het opslaan van data in mappen en files. De relevantie daarvan mis ik even in deze context.

Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Idd dat bedoel ik ;)
Het probleem hier is dus dat de labels niet bewaard blijven en dat ik op een of andere manier aan die labels moet gaan komen.

Mijn idee nu is om allen informatie over de spelers in bestanden/mappen op te slaan. Dit omdat je dan het spel kan laden.

Maar omdat ik op een of andere manier bij de pointer van de object moet komen ben ik nog aan het kijken hoe ik dit wil gaan doen. Dit kon volgens een index.

Hier boven was geschreven:

"Je zult dus ergens een collectie van Spelers bij moeten houden, die je op de een of andere manier ( Bijvoorbeeld met je char ) indexeert. "

Dit ben ik nu aan het uitzoeken hoe ik dit zal moeten gaan doen.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
lauwsa schreef op donderdag 28 oktober 2010 @ 14:50:

Hier boven was geschreven:

"Je zult dus ergens een collectie van Spelers bij moeten houden, die je op de een of andere manier ( Bijvoorbeeld met je char ) indexeert. "

Dit ben ik nu aan het uitzoeken hoe ik dit zal moeten gaan doen.
alstu

[ Voor 34% gewijzigd door Gamebuster op 28-10-2010 14:54 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je wil helemaal niet indexeren op naam. Net als dat je dat in PHP ook al niet wilde, ookal is dat wel mogelijk. Wat je wil is een verwijzing naar het object. Dus niet:
PHP:
1
2
3
4
5
6
7
function doeIetsMetSpeler($naam)
{
    $speler = $$naam;
    $speler->doeIets();
}

doeIetsMetSpeler("a");

Maar
PHP:
1
2
3
4
5
6
function doeIetsMetSpeler($speler)
{
    $speler->doeIets();
}

doeIetsMetSpeler($a);


In C++ werkt het precies zo, met pointers.
C++:
1
2
3
4
5
6
void doeIetsMetSpeler(Player * speler)
{
    speler->doeIets();
}

doeIetsMetSpeler(&a);


Je "tegenstander" variabele moet dan ook geen string zijn, maar een verwijzing naar een speler (een Player* dus)

[ Voor 9% gewijzigd door .oisyn op 28-10-2010 15:14 ]

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.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Wat je denk ik bedoeld is hoe je weet van welk type de opgeslagen data is..

Psuedo-stappen:
- Nieuwe objecten maken, data geven.
- Data opslaan in file, inclusief een bepaald 'type -id', zodat je weet of eht bijvoorbeeld een Enemy of een Player is (kan vanalles zijn, int, char, whatever)
- Bij laden: aan de hand van type-id (Player of Enemy bv) een nieuw object instantieren, vullen met data, toevoegen aan je collectie



of je bedoeld wat .oisyn uitlegt. :+
Ik ging er van uit dat je wel al wist hoe je objecten moet benaderen..... tenmisnte..als je 2 C++ boeken gelezen hebt mag ik daar toch wel van uitgaan...

[ Voor 19% gewijzigd door EddoH op 28-10-2010 15:03 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gamebuster schreef op donderdag 28 oktober 2010 @ 14:23:
Ik denk dat erg weinig C++ programmeurs hier begonnen zijn met C++ zonder eerst tenminste C#/Java gekend te hebben, of ze hadden een opleiding/cursus die ze rustig volgden.
Wellicht ben je nog wat jong, maar hier lopen behoorlijk wat mensen rond die hebben leren programmeren toen Java en C# nog niet eens bestonden of mainstream waren.

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.


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
.oisyn schreef op donderdag 28 oktober 2010 @ 14:59:
Je wil helemaal niet indexeren op naam. Net als dat je dat in PHP ook al niet wilde, ookal is dat wel mogelijk. Wat je wil is een verwijzing naar het object. Dus niet:
PHP:
1
2
3
4
5
6
7
function doeIetsMetSpeler($naam)
{
    $speler = $$naam;
    $speler->doeIets();
}

doeIetsMetSpeler("a");

Maar
PHP:
1
2
3
4
5
6
function doeIetsMetSpeler($speler)
{
    $speler->doeIets();
}

doeIetsMetSpeler($a);


In C++ werkt het precies zo, met pointers.
C++:
1
2
3
4
5
6
void doeIetsMetSpeler(Player * speler)
{
    speler->doeIets();
}

doeIetsMetSpeler(&a);


Je "tegenstander" veriabele moet dan ook geen string zijn, maar een verwijzing naar een speler (een Player* dus)
Werkt perfect, thanks :D
Maar ik ga even kijken hoe dat map presies werkt, altijd leuk om wat nieuws te leren ;)

@eddoh Dat weet ik wel, alleen ik had niet gedacht dat ik dat zo ook kon doen :$, ik was te lastig aan het denken.
Ik had de class omgezet na het label en wilde via dat label uitzoeken welke class het was...


Edit:

Dit hen ik aan het maken:
Afbeeldingslocatie: http://www.dullepannenkoek.nl/speletje.png

A - B kunnen zelf rond lopen, Y ben jij je kan je besturen via 4568 op numpad.
Je kan op c drukken voor een scherm wat je allenmaal hebt.
Door de # kan je niet heel lopen.
Ik was nu het battel systeem aan het maken.

Nog een keer bedankt iedereen!

Edit2:
Je kan zelf in map.txt je map type,

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
##########################
#000000000000000000000000#
#000000000###000000#00000#
#0####0000000000000#00000#
#0000#0000####00000#00000#
#0000#0000#00#00000#00AB0#
#0000#0000#00#00000#00000#
#0000#0000#00#00000#00000#
#0000#0000000000000#00000#
#0000#00000Y0000000#00000#
#0000#0000000000000#######
#0000#00000#######0000000#
#0000#0000000000000000000#
#0000#00000#0000000000000#
#0000#00000#0000000000000#
##########################


Als iemand het zelf wilt proberen roep maar dan stuur ik je het wel door ;)

[ Voor 39% gewijzigd door lauwsa op 28-10-2010 15:20 ]


Acties:
  • 0 Henk 'm!

  • Jewest
  • Registratie: Juni 2007
  • Laatst online: 11:54
Het hoeft in c++ niet per definitie met pointers.
referentie kan ook.

code:
1
2
3
4
5
6
void doeIetsMetSpeler(Player &speler)
{
    speler.doeIets();
}

doeIetsMetSpeler(a);


Wil je toch iets met pointers doen, maak ze dan const. (zie c++ boek of google)
Dan "helpt" de compiler je, om minder fouten te maken.

Flickr
Canon 7D + Glas + Licht
Komt het rot over dan bedoel ik het anders en taalfouten zijn inbegrepen.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bij de functieaanroep niet nee. Maar als hij een variabele heeft, zoals 'tegenstander', dan moet het toch echt een pointer zijn aangezien je een reference niet ergens anders naartoe kan laten wijzen.

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.


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Ja oke, kan je ze niet ineens de waardens gaan aanpassen of waar hij na verwijst niet kan aanpassen. En bijde kan ook nog.

Uit me hoofd, zo ver ik weet kan je niet nog meer met const pointers :P

Edit: maar waarom zou ik dat eigelijk willen?

[ Voor 11% gewijzigd door lauwsa op 28-10-2010 15:50 ]


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
lauwsa schreef op donderdag 28 oktober 2010 @ 15:50:
Ja oke, kan je ze niet ineens de waardens gaan aanpassen of waar hij na verwijst niet kan aanpassen. En bijde kan ook nog.

Uit me hoofd, zo ver ik weet kan je niet nog meer met const pointers :P

Edit: maar waarom zou ik dat eigelijk willen?
Je kan ook niet meer met const pointers/variables. Het is een restrictie die je jezelf oplegt om mogelijke bugs op te pikken tijdens het compilen van je programma i.p.v. tijdens het uitvoeren. Als je zoveel mogelijk "const" maakt is de ruimte op fouten kleiner.

Als je een variable hebt waarvan het niet de bedoeling is dat de waarde veranderd, maar het gebeurt toch ergens (foutje?), dan is het lastig te vinden waar het gebeurt is. Echter, als het een constante variable was, dan krijg je een error van de compiler.

Ook kan het de leesbaarheid van je code verbeteren.

[ Voor 20% gewijzigd door Gamebuster op 28-10-2010 15:58 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Ja oke, maar hier wil ik eigelijk geen van bijden toepassen. Als dat wel zo is dan sta ik er ook 100% achter als je dat zou doen.

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 14-04 17:27
.oisyn schreef op donderdag 28 oktober 2010 @ 15:03:
[...]
Wellicht ben je nog wat jong, maar hier lopen behoorlijk wat mensen rond die hebben leren programmeren toen Java en C# nog niet eens bestonden of mainstream waren.
Redelijk understatement. D'r lopen hier nog genoeg mensen rond die begonnen toen C++ nog niet eens bestond.

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


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Ben dit nu aan het bekijken,

code:
1
2
3
4
5
6
7
8
map<char,int> naam;

naam['a']=1;
naam['b']=2;
naam['c']=3;
naam['d']=4;

cout << naam['d'];


Werkt perfect :D, bedankt hier voor ;)
Ben nu aan het kijken wat de rest van de functies "kunnen/doen"

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
.oisyn schreef op donderdag 28 oktober 2010 @ 15:03:
[...]

Wellicht ben je nog wat jong, maar hier lopen behoorlijk wat mensen rond die hebben leren programmeren toen Java en C# nog niet eens bestonden of mainstream waren.
Hmm, niet bij nagedacht :9
Ben inderdaad "wat jong". (20)
Begonnen aan PHP op m'n 17e. Groentje dus.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Ik was helemaal vergeten mijn uitleg te posten over pointers in map te zetten :$

code:
1
2
3
4
5
6
7
    speler lauw; //maakt lauw lid van class speler
    speler * lauw2; //maakt een pointer 
    lauw2 = &lauw; //maapt lauw2 pointer naar lauw

    map<int,speler*> spelerm; //maakt een map waar je eerst een getal moet invoeren en dan de pointer
    spelerm[1] = lauw2; //zet onder 1 de pointer lauw2
    spelerm[1]->test1(); //laat een test bericht outputten


dit is dan test1 in class speler

code:
1
 int test1() { cout << "gelukt :D"; }


output

code:
1
gelukt :DPress any key to continue . . .


Hopelijk kan ik hier andere mee helpen die een soort gelijk probleem hebben!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Op deze manier vraag ik me alleen af waarom je een Map gebruikt en niet gewoon een array? Je indexeert zo te zien alleen op een oplopende index?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
En wat gebeurt er als variable "lauw" buiten de variable scope valt? Volgens mij kan je beter new speler() en delete gebruiken. Het is dan ook niet nodig eerst 2 variablen aan te maken.

Een map met ints als key... Kan je toch net zo goed een list gebruiken?

C++:
1
2
3
4
mijnmap[1] = new speler();
// doe een hoop met je speler
delete mijnmap[1]; // verwijder de speler
mijnmap.remove(1); // verwijder de pointer naar de verwijderde speler


Mogelijk klopt die remove method niet, ik zit nu op iPad en de documentatie opzoeken is me iets te.

Tutorials over c++ memory managment zijn zeker aan te raden.

[ Voor 51% gewijzigd door Gamebuster op 29-10-2010 11:11 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gamebuster schreef op vrijdag 29 oktober 2010 @ 11:02:
En wat gebeurt er als variable "lauw" buiten de variable scope valt?

Volgens mij kan je beter new speler() en delete gebruiken.
Dat is natuurlijk afhankelijk van hoe je het gebruikt, en welke scope het valt. Maar het zeker iets waar je op moet letten. Ik zou niet zondermeer aanraden om "new" te gebruiken.
Een map met ints als key... Kan je toch net zo goed een list gebruiken?
Alleen als je opvolgende indexen gebruikt natuurlijk.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • lauwsa
  • Registratie: Juli 2010
  • Laatst online: 17-04 17:01
Dit was eigelijk meer als voorbeeld bedoeld, uiteindelijk wil ik er geen oplopende nummering in gebruiken.
En het is idd handiger om meteen de speler in de "map" te zetten.

Ik zal idd c++ memory managment tuts gaan lezen

Edit: zin 2 = als ik dan een oplopende nummerin gebruik.

[ Voor 11% gewijzigd door lauwsa op 29-10-2010 12:24 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gamebuster schreef op vrijdag 29 oktober 2010 @ 11:02:
Een map met ints als key... Kan je toch net zo goed een list gebruiken?
Nee, een vector. Een list heeft geen operator[], en als ie die had zou die O(n) zijn.

[ Voor 7% gewijzigd door .oisyn op 29-10-2010 12:24 ]

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.


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

TS: Let wel op dat een STL list een O(n) complexity met lookup heeft in worst-case, dat kan een afweging zijn als je lijst groeit zal ook het opzoeken van waarden lineair groeien qua tijd. Bij kleine lijsten niet echt merkbaar wellicht, maar bij wat grotere lijsten zeker wel. Als je qua indices alleen met oplopende numerieke waarden werkt kan je eventueel een vector/array overwegen zoals hierboven al is voorgesteld, die zal je over het algemeen constant time moeten geven qua lookup: dat houdt in dat het opvragen van een element over 't algemeen altijd evenveel tijd kost onafhankelijk van hoe groot de array/vector is.

Werk je niet alleen met oplopende numerieke waarden dan kan het zo zijn dat je aardig wat gaten gaat hebben in je opslagstructuur, b.v. dat je waarden hebt tussen 0...n, waarbij n b.v. heel groot kan zijn maar je daadwerkelijk maar 2 waarden gebruikt (0 en n) b.v. Dat kan inefficient zijn.

Daarbij kan het zelfs zijn dat je qua "keys" niet eens met numerieke waarden werkt. In zo'n geval is een map geen gek idee, die is onderwater over 't algemeen gewoon gebacked met een array waarbij de indices gehashed zijn. Dit geeft je in ieder geval over 't algemeen dus ook constant time lookup (gegeven dat de hashing algo ook constant time is wat het over 't algemeen wel is ;-))

Update: aargh .oisyn ;-) Doe's niet zo snel reageren.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

prototype schreef op vrijdag 29 oktober 2010 @ 12:32:
In zo'n geval is een map geen gek idee, die is onderwater over 't algemeen gewoon gebacked met een array waarbij de indices gehashed zijn.
Nee, een std::map is typisch een red-black tree. Een std::tr1::unordered_map gebruikt een hash table (en is aan te raden als, zoals de naam doet vermoeden, ordering niet uitmaakt)

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.


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

.oisyn schreef op vrijdag 29 oktober 2010 @ 12:40:
[...]

Nee, een std::map is typisch een red-black tree. Een std::tr1::unordered_map gebruikt een hash table (en is aan te raden als, zoals de naam doet vermoeden, ordering niet uitmaakt)
Had het niet specifiek over std::map, maar idd :)

Acties:
  • 0 Henk 'm!

  • RoadRunner84
  • Registratie: Januari 2002
  • Laatst online: 07-04-2020

RoadRunner84

Meep meep

Waarom zijn speler en enemy geen child classes van "actor" ofzo? Ik bedoen, beiden hebben een x,y,health,armor,weapon en geen van beiden kunnen door muren lopen...
Ik zie een heleboel overlap, als je dan een array/list/map/vector maakt (waarom een map, ik zie echt het nut ervan niet) kan je die van templaten op actor i.p.v. enemy.

Waarom zijn je actor niet gewoon geindexeerd met een nummer? Je kunt desnoods een property "display" maken die het char bevat dat er voor die actor (player/enemy) weergegeven moet worden, een 'A', 'B' of 'Y' dus.

Ohja, en je kan actor natuurlijk weer baseren op een klasse 'tile', waar ook de childklasse 'wall' onder valt...

http://specs.tweak.to/list/3907 | π = τ/2


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 11-05 14:06
RoadRunner84 schreef op vrijdag 29 oktober 2010 @ 13:05:
Waarom zijn speler en enemy geen child classes van "actor" ofzo? Ik bedoen, beiden hebben een x,y,health,armor,weapon en geen van beiden kunnen door muren lopen...
Ik zie een heleboel overlap, als je dan een array/list/map/vector maakt (waarom een map, ik zie echt het nut ervan niet) kan je die van templaten op actor i.p.v. enemy.

Waarom zijn je actor niet gewoon geindexeerd met een nummer? Je kunt desnoods een property "display" maken die het char bevat dat er voor die actor (player/enemy) weergegeven moet worden, een 'A', 'B' of 'Y' dus.

Ohja, en je kan actor natuurlijk weer baseren op een klasse 'tile', waar ook de childklasse 'wall' onder valt...
Zijn er eigenlijk ergens richtlijnen met namen die je "moet" geven aan objecten? Ik heb zelf regelmatig problemen met wat voor naam ik een bepaalde class moet geven, met name binnen games.

edit: ik maak wel een nieuw topic

[ Voor 4% gewijzigd door Gamebuster op 29-10-2010 14:36 . Reden: "classe" naar "class" veranderd. ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou ik zou beginnen met het beestje een "class" of "klasse" te noemen, maar niet "classe" ;)

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