Som besökare på Hamsterpaj samtycker du till användandet av s.k. cookies för att förbättra din upplevelse hos oss. Jag förstår, ta bort denna ruta!
Annons

Instans av en abstrakt klass, c++

Skapad av Borttagen, 2012-10-22 22:12 i Webbutveckling & Programmering

5 264
20 inlägg
1 poäng
MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
1
Jag sitter just nu och försöker göra klart ett skolarbete som går ut på att i c++ skapa ett "Space Invaders", och får ett problem jag inte vet hur jag skall kring gå.

Jag har en abstrakt basklass för alla entiteter i spelet. Och en subklass till den "bullet" skall skapa kulorna som skjuts. Men eftersom bullet ärver 2 pure virtual metoder(vilket 2 av de andra subklasserna behöver) så kan jag inte skapa instancer av "bullet".

Så min fråga är helt enkelt, hur kan jag kringgå detta problem?

one by one the penguins steal my sanity

Är reklamen ivägen? Logga in eller registrera dig så försvinner den!

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till MosHiBi [Gå till post]:
Basklass* bullet = new Bullet();
*använd den*
delete bullet; <- när du är färdig med den, och förhoppningsvis har ni gått in på pekare...

Borde väl fungera, eller har jag missuppfattat din fråga?

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
Jo jag trodde de skull fungera med, men antingen gör jag fel. Eller så fungerar det inte. Kan posta koden.


Entity.h Basklassen
Visa spoiler
[code:c++]
#ifndef INCLUDED_ENTITY
#define INCLUDED_ENTITY

#include "VGCVirtualGameConsole.h"
#include <vector>
#include <string>
#include <sstream>

class Entity{
public:
typedef std::vector<Entity*> EntityVector;
EntityVector entities;
Entity();
virtual ~Entity();
virtual bool isAlive() = 0;
virtual void render(Layer layer) = 0;
};
#endif


[/code]

Bullet.h
Visa spoiler
[code:c++]
#ifndef INCLUDED_BULLET
#define INCLUDED_BULLET
#include "Entity.h"

class Bullet : public Entity{
public:
Bullet(Category, const VGCVector &position;, const VGCVector &diretion;);
virtual ~Bullet();
[/code]

Invader.cpp(subklass som för fiendens skepp)
Visa spoiler
[code:c++]
void Invader::fire(EntityVector &entities;){
if(VGCClock::isExpired(mReloadTimer)){
const VGCVector direction(0, 1);
entities.push_back(new Bullet(ENEMY, mPosition, direction));
VGCClock::reset(mReloadTimer);
}
}

[/code]


Tror detta är all den beröda koden.

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till MosHiBi [Gå till post]:
[code]Bullet(Category, const VGCVector &position;, const VGCVector &diretion;);[/code]
Du borde få compiler-errors på den raden.
"Incomplete type not allowed" eller nåt liknande.

Kan hända att jag är trött, men annars ser det bra ut...

Btw, VirtualGameConsole? Aldrig hört talas om och Google hjälper inte så mycket...

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
Får endast error c2059 'bullet' : cannot instantiate abstract class.

virtualgameconsole är ett bibliotek som högskolan i skövde byggt specifikt för detta projekt:/ så finns inte mycket hjälp där.

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till MosHiBi [Gå till post]:
Du har gjort en prototyp för Entity(), men har du deklarerat den nånstans?

pröva att byt ut: Entity(); till Entity() {}



Tillägg av Splux 2012-10-22 23:21

Btw, C2059 är:
"error C2059: syntax error"... säker på att du inte blandar ihop? :x

Ingen status

Vincent509
Visningsbild
P 34 Karlstad Hjälte 325 inlägg
0
Nu är jag inte helt haj på varken c++ eller abstrakta klasser, men jag antar att de fungerar som interfaces. Syftet är alltså inte att instansiera den abstrakta klassen, utan låta en annan klass ärva från den (bullet i detta fall) och sedan implementera alla metoder i basklassen.

Från vad jag kan se så implementerar du inte metoderna i din bullet klass utan försöker instansiera en klass med virtuella/generella/abstrakta metoder vilket är helt åt skogen.
Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till Vincent509 [Gå till post]:
class A
{
virtual void hej() = 0;
};

class B : public A
{
B() {}
void hej()
{
std::cout << "hej" << std::endl;
};
int main(void)
{
A* b = new B();
b->hej()
return 0;
}

Typ sådär fungerar det i C++ om man använder pekare.



Tillägg av Splux 2012-10-22 23:25

OP:
Eftersom att du har helt virtuella metoder i din basklass så måste du deklarera dem i klassen som ärver från basklssen också...
*facepalm* på att jag inte tänkte på det.



Tillägg av Splux 2012-10-22 23:27

http://msdn.microsoft.com/en-us/library/zxt206sk(v=vs.100).aspx

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0
Svar till Splux [Gå till post]:
Oj, menade c2259.
Och att ändra till Entiy{} funkade inte, löste dock ett annat problem


Svar till Vincent509 [Gå till post]:
Nu är jag inte helt med på hur du menar.:/



Tillägg av MosHiBi 2012-10-22 23:34

Men på något sätt behöver jag väll skapa ett objekt av bullet för att sedan instansiera objektet. Eller är jag inne på fel spår nu?

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till MosHiBi [Gå till post]:
Jo, kom på det efter lite googlande ;)

Men, alla dina pure virtual måste deklarerar även i klassen som ärver från basklassen.
Exempel från MSDN;
class V {
public:
void virtual func() = 0;
};
class A : public V {};
class B : public V {
public:
void func();
};
V v; // C2259, V is an abstract class
A a; // C2259, A inherits func() as pure virtual
B b; // OK, B defines func()



Tillägg av Splux 2012-10-22 23:38

Du kan antingen;
Entity* bullet = new Bullet();
Eller;
Bullet bullet();

Men om du har en pure virtual metod i din basklass (som du har), så måste den deklareras i klassen som ärver.
t.ex;
class Entity
{
// massa annat
public:
virtual bool isWhatever() = 0;
// lite till
};
class Bullet : public Entity
{
public:
bool isWhatever(){ return whatever;} // deklareras även här i klassen som ärver
};

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
Hmm löser inte problemet.
Men menar du att om jag skall skapa den i
entities.push_back(new Bullet(ENEMY, mPosition, direction));
så ska jag ändra till
entities.push_back(Entity* bullet = new Bullet();(ENEMY, mPosition, direction));
eller
entities.push_back(Bullet bullet();(ENEMY, mPosition, direction));
Har prövat båda men inget funkar har även ändrat om och scopat Entityklassen osv:/

Men jag känner igen de du skrev. Så de är iallafall något i stil med det. Så får sitta och pilla lite mer. Tack för hjälpen

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0

Svar till MosHiBi [Gå till post]:
du skulle kunna pröva det här, bara som test;
Entity* temp = new Bullet(detdärduharsomparameterlista);
entities.push_back(temp);

Men, detta är för att tjata (det är kul); kom ihåg att deklarera alla pure virtual metoder i klassen som ärver, annars får du C2259.

(och C2059 får du om du inte ändrar "Bullet(Category, const VGCVector &position;, const VGCVector &diretion;);" till "Bullet(Category, const VGCVector &position;, const VGCVector &diretion;);" :3 )

Får se om jag kommer på nåt mer som kan vara till hjälp imorgon.

I värsta fall om ingen kan hjälpa dig så får du dela med dig av mer kod + dina error, lättare då.

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
att lägga till ";" gav mig c2059^^
Och temp testet ger samma error som tidigare.
Men du får gärna säga till om du kommer på något mer.

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0

Svar till MosHiBi [Gå till post]:
Whoops, glömde bort ett semikolon som inte skulle vara där...

I parameterlistan ska det inte vara några semikolon alls, och om du definierar en konstruktor så har jag för mig att du även måste definiera en default konstruktor.

Kan du lägga upp hela error-listan + de berörda kodbitarna? Eller har du löst det? :)

Du ska vara glad för att du inte kommer förbi kompilatorn och får linker errors istället... De är helt intetsägande.

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
Error listan är endast c2259.
Och sitter i skolan nu utan internet men ska se om jag kan fixa ett minne och dra över projektet på en annan dator och posta lite kod

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till MosHiBi [Gå till post]:
Och C2259 beror på att du ärver metoder som är pure virtual, men du deklarerar dem inte i klassen som ärver.

class A
{
public:
virtual void hej() = 0; // deklarerad som pure virtual
};
class B : public A
{};
class C : public A
{
public:
void hej(){printf("hej");}
};
A a; <- ger C2259, abstract class.
B b; <- ger C2259, pga. pure virtual metoderna som ärvs
C c; <- kompilerar utan problem, C har deklarerat "hej()"

A* c = new C(); borde också fungera, men
A* b = new B(); <- C2259

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
Jo kom precis på det, va för trött för att inse att det inte räcker att deklarera dem igår utan att jag behöver defeniera med.
Så nu tror jag att problemet är löst. Tack:)

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0
Svar till MosHiBi [Gå till post]:
Var så lite så :)

Justja, om ni håller på och gör ett spel i kommandotolken... läs det här:
http://www.cplusplus.com/forum/articles/28558/

Ingen status

MosHiBi
Visningsbild
P 31 Skara Hjälte 4 994 inlägg
Trådskapare
0

Svar till Splux [Gå till post]:
De gör vi inte och kommer inte göra vad jag vet. Men ska ta och kolla på den nu efter tentaperioden och se om man kan göra något kul:3

one by one the penguins steal my sanity

Splux
Visningsbild
P 30 Västerås Hjälte 3 131 inlägg
0

Svar till MosHiBi [Gå till post]:
Vad bra, den tråden har ett syfte; få folk att sluta med att göra spel i kommandotalken.

Utgick från att det var kommandotolken med tanke på namnet på biblioteket ;)
Men lycka till med spelet!

Ingen status


Forum » Datorer & IT » Webbutveckling & Programmering » Instans av en abstrakt klass, c++

Ansvariga ordningsvakter:

Användare som läser i den här tråden just nu

1 utloggad

Skriv ett nytt inlägg

Hej! Innan du skriver om ett potentiellt problem så vill vi påminna dig om att du faktiskt inte är ensam. Du är inte onormal och världen kommer inte att gå under, vi lovar! Så slappna av och gilla livet i några minuter - känns det fortfarande hemskt? Skriv gärna ner dina tankar och frågor, vi älskar att hjälpa just dig!

Den här tråden är äldre än Rojks drömtjej!

Det senaste inlägget i den här tråden skrevs för över tre månader sedan. Är du säker på att du vill återuppliva diskussionen? Har du något vettigt att tillföra eller passar din fråga i en ny tråd? Onödiga återupplivningar kommer att låsas så tänk efter en extra gång!

Hjälp

Det här är en hjälpruta

Här får du korta tips och förklaringar om forumet. Välj kapitel i rullningslisten här ovanför.

Rutan uppdateras automagiskt

När du använder funktioner i forumet så visas bra tips här.


Annons
Annons
Annons
Annons