Avatar billede krukken Juniormester
27. september 2004 - 19:45 Der er 7 kommentarer og
1 løsning

Array af pointer til objekter i et klasse hieraki

Jeg har et klasse hieraki hvor jeg har en en abstrakt klasse( som kun indeholde pure vitual funktioner)

I en anden klasse opretter jeg objekter af de nedarvede klasser. Spørgsmålet er nu, hvordan ligger man disse oprettede objeter i et array/list/vector så de kan returneres, og de stadigvæk beholder deres identitet.

meningen er at jeg kan gøre noget der minder om følgende

for(int = 0; i < antal; i++)
{
  indholdafwhatever[i]->print();
}

I dette tilfælde er indholdafwhatever blevet returneret.

Jeg vil meget gerne se et kode eksempel
Avatar billede arne_v Ekspert
27. september 2004 - 19:49 #1
Du har en abstrakte basis klasse med ee pure virtual metoder (det der det som
hedder et interface i Java og C#) lad os kalde den BC.

Du har et antal konkrete klasser som arver fra den lad os kalde dem SC1, SC2, SC3.

Du erklærer så et array eller en vector af BC.

Gemmer instanser af SC1, SC2 og SC3 i den.

Du kan så hente ud af array/vector og kalde alle de metoder der er defineret
for BC på objekterne uanset om det er en Sc1, SC2 eller SC3.

Det er basal polymorfisme.

SKal jeg kode et eksempel ?
Avatar billede krukken Juniormester
27. september 2004 - 19:52 #2
Ja, tak - og meget gerne med en vector. Fordi det er faktisk nøjaktigt det jo gør nu, og det fungere ikke. Jeg får at vide noget at der ikke kan kaldes en metode på en vitual klasse.

Gider du at lave en lille kort eksempel?
Avatar billede arne_v Ekspert
27. september 2004 - 19:55 #3
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class BC
{
public:
    virtual void print() = 0;
};

class SC1 : public BC
{
public:
    virtual void print() { cout << "I am a one" << endl; };
};

class SC2 : public BC
{
public:
    virtual void print() { cout << "I am a two" << endl; };
};

class SC3 : public BC
{
public:
    virtual void print() { cout << "I am a three" << endl; };
};

int main()
{
  vector<BC*> v;
  v.push_back(new SC1());
  v.push_back(new SC1());
  v.push_back(new SC3());
  v.push_back(new SC2());
  for(int i=0;i<v.size();i++) v[i]->print();
  return 0;
}
Avatar billede arne_v Ekspert
27. september 2004 - 19:56 #4
Og output er som det skal være:

I am a one
I am a one
I am a three
I am a two
Avatar billede krukken Juniormester
27. september 2004 - 21:17 #5
Jeps - så langt er jeg netop også nået. Men lad os så side at vectoren v skal returnedes fra en funktion, hvordan gør man så det?
Avatar billede krukken Juniormester
27. september 2004 - 21:17 #6
Det er nemlig der problemet opstår, så er det ligesom om at objekterne mister deres identitet.
Avatar billede arne_v Ekspert
27. september 2004 - 21:23 #7
Det her virker også fint:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class BC
{
public:
    virtual void print() = 0;
};

class SC1 : public BC
{
public:
    virtual void print() { cout << "I am a one" << endl; };
};

class SC2 : public BC
{
public:
    virtual void print() { cout << "I am a two" << endl; };
};

class SC3 : public BC
{
public:
    virtual void print() { cout << "I am a three" << endl; };
};

vector<BC*> init()
{
    vector<BC*> res;
    res.push_back(new SC1());
    res.push_back(new SC1());
    res.push_back(new SC3());
    res.push_back(new SC2());
    return res;
}

int main()
{
  vector<BC*> v = init();
  for(int i=0;i<v.size();i++) v[i]->print();
  return 0;
}
Avatar billede krukken Juniormester
27. september 2004 - 22:24 #8
Hmm - du har jo ret som altid:-) Jeg forstår det simplet ikke - jeg har prøvet nøjagtigt det samme, men det ville ikke fungere. Men nu virker det, så det er jo helt fint.

Tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester