c++ - hjälp med "fightsystem".

Permalänk

Har ett problem till...
Det går inte att skriva ut vektorn "inventory", felmeddelandet lyder så här "IntelliSense: no operator "<<" matches these operands".
Det kommer när jag skriver: "cout << inventory[0] << endl;"

Koden:

class Item { public: Item (string inamn, int idam); string Getinamn(); int Getidam(); }; void game() { ///oviktigt/// system("cls"); srand(time(0)); int menyval; ///oviktigt/// vector<Item> inventory; inventory.push_back(Item("Sword", 10));

Har markerat det som är oviktigt, alltså som inte rör inventoryt elr problemet.

Har även skrivit på andra sätt, ungefär samma som ni visade men det kommer samma felmeddelande när jag försöker göra en utskrift.
Vad beror det på? Jag gjorde bara en liten prototyp för att se om det funkar, man ju ska kunna skriva ut vektorn när användaren väljer att han vill se backpacken/inventoryt.

Permalänk
Hedersmedlem
Skrivet av 3liteSoldier:

Vad beror det på? Jag gjorde bara en liten prototyp för att se om det funkar, man ju ska kunna skriva ut vektorn när användaren väljer att han vill se backpacken/inventoryt.

Det beror på att cout inte vet vad den skall göra när ett Item-objekt skickas till den. Man kan definiera detta själv, men enklast är nog att istället till exempel skriva:

cout << inventory[0].GetName() << endl;

Permalänk

Tack! Nu slipper jag det felmeddelandet.

Däremot kom det tre nya felmeddelanden (som inte fanns där innan) där det stod:
(felmeddelande 1) error LNK1120: 2 unresolved externals

(felmeddelande 2) error LNK2001: unresolved external symbol "public: __thiscall Item::Item(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Item@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)

(felmeddelande 3) error LNK2001: unresolved external symbol "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Item::Getinamn(void)" (?Getinamn@Item@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)

Ser helskumt ut, speciellt när det inte var där innan..

Permalänk
Hedersmedlem
Skrivet av 3liteSoldier:

Tack! Nu slipper jag det felmeddelandet.

Däremot kom det tre nya felmeddelanden (som inte fanns där innan) där det stod:
(felmeddelande 1) error LNK1120: 2 unresolved externals

Har du använt GetName() tidigare? Annars låter det som att du har missat att definiera den (eller eventuellt missat ett "const" eller så).

Se till att det någonstans, till exempel efter

Item::Item(string name, double damage) { ...

finns till exempel

const string& Item::GetName() { return m_name; }

Permalänk

Så här ser det ut nu:

class Item { private: string m_inamn; int m_idam; public: Item (string inamn, int idam); int Getidam(); const string& Getinamn(); }; void game() { ///oviktigt/// system("cls"); srand(time(0)); int menyval; ///oviktigt/// vector<Item> inventory; inventory.push_back(Item("Sword", 10));

Men ändå kvarstår de tre felmeddelanden.

Permalänk
Medlem

Det beror på att vi bara har definierat Item, hur den ska se ut, dvs det finns ingen kod som utför något, funktionerna ska läggas till, ungefär som Elgot skrev. Jag återkommer lite senare om du inte löser det, har lite annat att pyssla med just nu.

Permalänk
Skrivet av Dalton Sleeper:

Det beror på att vi bara har definierat Item, hur den ska se ut, dvs det finns ingen kod som utför något, funktionerna ska läggas till, ungefär som Elgot skrev. Jag återkommer lite senare om du inte löser det, har lite annat att pyssla med just nu.

Okej, men tack för du tar din tid iaf ;P

Permalänk
Medlem
Skrivet av 3liteSoldier:

Okej, men tack för du tar din tid iaf ;P

Okey, here we go...
du hade din Item definition som sådan

class Item { private: string m_inamn; int m_idam; public: Item (string inamn, int idam); int Getidam(); const string& Getinamn(); };

De i fet stil är definitioner endast därför går det inte att kalla dessa, vi måste fylla i dom med kod som utgör själva arbetet.

Alt 1: Om man tex klistrar in dessa rader under klassen Item:

//Item:: står för att detta tillhör klassen item ovan Item::Item (string inamn, int idam){ //namn & parametrar måste se ut som i definitionen! m_inamn=inamn; //vi tilldelar item nytt namn m_idam=idam; //samt damage } //här fyller vi i att vi ska returnera en kopia på variabeln m_idam som står i definitionen int Item::Getidam(){ return m_idam; //när vi anropar denna får vi tillbaka damage } //här returnerar vi en referens till namnet const string& Item::Getinamn(){ return m_inamn; //här får vi tillbaka namn }

Alt 2: Men, det går lika bra att skriva koden direkt i klassen Item:

class Item { private: string m_inamn; int m_idam; public: Item (string inamn, int idam){ m_inamn=inamn; //vi tilldelar item nytt namn m_idam=idam; //samt damage } int Getidam(){ return m_idam; //när vi anropar denna får vi tillbaka damage } const string& Getinamn(){ return m_inamn; //här får vi tillbaka namn } };

Permalänk

Hur ser det ut nu? Är jag på god väg elr helt ute och cyklar?

Koden:

class Item { private: string m_inamn; int m_idam; public: Item (string inamn, int idam); int Getidam(); const string& Getinamn(); }; Item::Item (string inamn, int idam) { inamn=m_inamn; idam=m_idam; } const string& Getinamn() { return m_inamn; }; int Getidam() { return m_idam; } void game() { ///oviktigt/// system("cls"); srand(time(0)); int menyval; ///oviktigt/// vector<Item> inventory; inventory.push_back(Item("Sword", 10));

Dock står det att både m_inamn och m_idam är "undefined".

Hur ska jag göra nu för att komma på rätt spår? Någon som orkar ödsla tid på att hjälpa en beginner, hehe ^^?

Permalänk
Medlem
Skrivet av 3liteSoldier:

Hur ser det ut nu? Är jag på god väg elr helt ute och cyklar?
...
Dock står det att både m_inamn och m_idam är "undefined".

Hur ska jag göra nu för att komma på rätt spår? Någon som orkar ödsla tid på att hjälpa en beginner, hehe ^^?

Ta en titt på min post ovan, du är på rätt väg

Permalänk
Skrivet av Dalton Sleeper:

Ta en titt på min post ovan, du är på rätt väg

Oops, såg inte att du hade skrivit ovan ;).
Men perfekt! Nu funkar det utomordentligt bra

Permalänk

Dock är det ett ytterligare litet (litet) problem.
När jag skriver "cout << inventory[0].Getidam() << endl;" så står det istället för 10 som jag knappat in tidigare (kolla kod) står det
"-85899..(osv)". Precis som om jag inte hade haft en int utan någon annan typ som inte är meningen att användas för heltal.
Och när jag skriver "cout << inventory[0].Getinamn() << endl;" så står det inget alls :S.

Permalänk

Löste det nu, det var verkligen ett litet (litet) problem xD.
Det var så simpelt som att jag hade skrivit: "inamn=m_inamn; idam=m_idam;" istället för det korrekta: "m_inamn=inamn; m_idam=idam;"

Permalänk
Medlem

Den första är ett heltal och måste behandlas som ett heltal isf, i detta fall kan vi konvertera till char:
Du bör ha en:

char buffer[50];

uppe bland dina variabler... när du sedan har hämtar damage från nån Item så konverterar du:

sprintf(buffer,"%d",damage); // nån konvertering till string

%d om det är heltal & %f om det är flyttal.
Nu kanske det inte är det snyggaste sättet, nån annan kanske kan nått snabbare?

Sedan bör cout << buffer << endl; fungera för att skriva ut dina siffror.

Om du får ut skumma grejer bör du jämföra med min kod i funktionerna så du använder rätt ordning, jag råkade se att du gjort tilldelningen åt fel håll ovan.

Edit, den första kanske fungerar ändå i c++ kom jag på iaf vid utskrifter...

Permalänk
Medlem
Skrivet av 3liteSoldier:

Löste det nu, det var verkligen ett litet (litet) problem xD.
Det var så simpelt som att jag hade skrivit: "inamn=m_inamn; idam=m_idam;" istället för det korrekta: "m_inamn=inamn; m_idam=idam;"

bra att du kom på det, jag var lite seg med svaret
Jag kom på att det går att skriva ut siffror i c++ utan konvertering, så länge man använder cout

Permalänk
Skrivet av Dalton Sleeper:

bra att du kom på det, jag var lite seg med svaret
Jag kom på att det går att skriva ut siffror i c++ utan konvertering, så länge man använder cout

Hehe, bättre sent än aldrig.
Men hur definierar jag datamedlemmen "NumberOf" i classen som du skrev tidigare.
Jag antar att det menas med att man bara kan ha ett visst antal saker i inventoryt, så hur ska jag göra på smidigast sätt?

Permalänk
Medlem
Skrivet av 3liteSoldier:

Hehe, bättre sent än aldrig.
Men hur definierar jag datamedlemmen "NumberOf" i classen som du skrev tidigare.
Jag antar att det menas med att man bara kan ha ett visst antal saker i inventoryt, så hur ska jag göra på smidigast sätt?

Det finns väll ingen funktion som sätter eller hämtar den variabeln, kanske kan du skriva dom själv?
Jag skrev bara dit den för att det verkade lämpligt just då, vet inte om den är bra att använda, eller om man vill ha flera "riktiga" kopior av nån anledning, saker man brukar ha mycket av, potions & sånt så kanske den är bra ändå. Vill du använda den så kan du skriva en SetXXX och en GetXXX som har inparameter av int samt retur av int. Du ser redan hur man sätter variablarna och hur man får tillbaka dom, visa nu att du kan

Permalänk
Skrivet av Dalton Sleeper:

Det finns väll ingen funktion som sätter eller hämtar den variabeln, kanske kan du skriva dom själv?
Jag skrev bara dit den för att det verkade lämpligt just då, vet inte om den är bra att använda, eller om man vill ha flera "riktiga" kopior av nån anledning, saker man brukar ha mycket av, potions & sånt så kanske den är bra ändå. Vill du använda den så kan du skriva en SetXXX och en GetXXX som har inparameter av int samt retur av int. Du ser redan hur man sätter variablarna och hur man får tillbaka dom, visa nu att du kan

Jepp!

Permalänk
Hedersmedlem
Skrivet av Dalton Sleeper:

De i fet stil är definitioner endast därför går det inte att kalla dessa, vi måste fylla i dom med kod som utgör själva arbetet.

Deklarationer, om man skall vara petig. Definitioner definierar funktionerna fullständigt och innehåller alltså även funktionskoden.

Permalänk
Medlem
Skrivet av Elgot:

Deklarationer, om man skall vara petig. Definitioner definierar funktionerna fullständigt och innehåller alltså även funktionskoden.

Mjo, jag har nog lite svårt med det där...
Jag tänker att: man deklarerar variabler & pekare, dvs de går att använda, definiera gör man med mallar som klasser och andra datatyper. I mitt huvud kallar jag inte dessa funktioner som deklarerade utan definierade, dom skall finnas men finns inte (i detta fall) och man har definierat hur dom ska se ut, man har definierat interfacet, och man har inte kroppen...

Det kanske låter tokigt men men, antagligen lite tokig jag också Jag tycker meningen med orden blir något fel eller opassande, efter alla kurser i mjukvaruutveckling, komponentbaserad programvaruteknik, validering & verifiering innehållande komponenter, interface och kontrakt etc får en att särskilja på saker så detta har blivit ordens betydelse, det kanske är opassande för många andra och det kanske inte heller är direkt relaterat till programmering och dess termer men det är min uppfattning. Troligen kanske det skiljer något om jag skriver/tänker på svenska eller engelska.

ni får gärna kommentera detta och komma med åsikter, känns det som något viktigt, bör jag tvinga mej själv att byta uppfattning? Förmodligen skulle det krångla till något annat

Nu blir det stargate!

Permalänk
Hedersmedlem
Skrivet av Dalton Sleeper:

Mjo, jag har nog lite svårt med det där...
Jag tänker att: man deklarerar variabler & pekare, dvs de går att använda, definiera gör man med mallar som klasser och andra datatyper.

Ofta krävs väl dock mer än deklaration även för variabler (typiskt en tilldelning eller så) innan de kan användas?
Kanske blir man också mera förvirrad av att skilja på gränssnitt (och alltså kunna tycka att de är definierade och färdiga medan implementationerna återstår) än att endast se icke-kompletta (deklarerade) och kompletta (definierade) implementationer?

Permalänk

Vid sidan om rpgspelet håller jag på att lära mig Allegro.
Det har funkat utmärkt med kompileringen och så, men det går inte att ladda en bitmap :\
När jag försöker provköra kommer det bara upp en errorskylt där det står "abort() has been called".

Koden:

#include <allegro.h> BITMAP *bild; int main() { while (!key[KEY_ESC]) { allegro_init(); install_keyboard(); set_color_depth(16); set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); bild = load_bitmap("box.bmp", NULL); acquire_screen(); blit(bild, screen, 0,0,0,0,480,360); release_screen(); } return 0; } END_OF_MAIN();

Någon som är bra på allegro som kan hjälpa mig?

Permalänk
Medlem
Skrivet av 3liteSoldier:

Vid sidan om rpgspelet håller jag på att lära mig Allegro.
Det har funkat utmärkt med kompileringen och så, men det går inte att ladda en bitmap :\
När jag försöker provköra kommer det bara upp en errorskylt där det står "abort() has been called".

Koden:
...

Någon som är bra på allegro som kan hjälpa mig?

Jag tycker du ska öva lite mer på programmering först som det ser ut...
men för att svara på något så kör du initfunktionerna för varje loop, de ska bara köras en gång, bilden skall bara läsas in en gång!

För övrigt känns allegro väldigt gammalt, jag använde det för en jädrans massa år sedan, men det kanske uppdateras fortfarande?

Permalänk
Medlem

Vilken version av allegro kör du med?

Permalänk

SDL är annars ett bra bibliotek för att göra grafiska grejer. Bara man kommer in i det så går det hur fort som helst. Googla också på Lazy Foo för tutorials. Har inte tid att fixa länkar.

Permalänk
Medlem
Skrivet av Sephinator:

SDL är annars ett bra bibliotek för att göra grafiska grejer. Bara man kommer in i det så går det hur fort som helst. Googla också på Lazy Foo för tutorials. Har inte tid att fixa länkar.

Håller med, verkar vara lite mer klass på sdl känns det som, har dock inte testat allegro på många år men svårt att tänka mig att det är likvärdigt sdl Det var väll mer skrivet för c har jag för mig?

För övrigt så kör jag i stort sätt bara sdl nu, har använt det ett par gånger förr och varje dag det senaste året då jag skriver ett framework (för 3d interface) baserat på sdl. Körde på endast glut förut men det var för gammalt och gav finfina buggar när man väl började använda det mer seriöst, sdl löste allt och har fungerat finfint och har inte påträffat några begränsningar än, använder dock något från glut & glew också.

Permalänk
Skrivet av Dalton Sleeper:

Vilken version av allegro kör du med?

5 tror jag.
Men jag ska nog köra SDL istället, många säger att det är bra :P.

Permalänk

Jag håller nu på med mitt första utkast i spelet.
Har kommit långt tack vare er

Permalänk
Medlem
Skrivet av 3liteSoldier:

Jag håller nu på med mitt första utkast i spelet.
Har kommit långt tack vare er

:D, hur går det på grafiska fronten då?

Permalänk
Skrivet av Dalton Sleeper:

:D, hur går det på grafiska fronten då?

Tjao.. håller på med att lägga pricken över iet på rollspelet, men nästa projekt blir det väl ngt pong-likt spel med grafik ;P