Avatar billede mikkeljans Nybegynder
04. april 2004 - 13:05 Der er 10 kommentarer

SuperKlasse Liste

Hvis nu jeg har 3 SubKlasse: Sub1, Sub2, Sub3
Og 1 SuperKlasse: Super1
Og alle Subklasserne er nedarvet fra den: Sub1 : Super1...
SuperKlassen har ingen Virtuelle functioner.
Den har kun nogen functioner som alle SubKlasserne har tilfældes.

Men vær eneste gang jeg laver et nyt object af en SubKlasse skal den ind i en Liste så jeg få fat i det bestemte object.

Jeg kunne f.eks lave en Liste Klasse til hver SubKlasse.
Sub1Liste, Sub2Liste, Sub3Liste.

Men er det ikke muligt at bare lave en liste over SuperKlassen som indeholder en liste over SuperKlasse objecter som peger på de forskellige SubKlasse Objecter?

Men hvis jeg gør det hvordan skal jeg så kunne genkende dem fra hinanden?

F.eks:
SuperKlasseListe SuperListe;
SuperListe.Add(Sub1Object);
SuperListe.Add(Sub2Object);
SuperListe.Add(Sub3Object);
SuperListe[0].EnFunctionFraSubKlasse1;

Hvis jeg skriver sådan og laver en [] Operator i SuperKlasseListen.. Så skal den Operator jo retunere enten et Sub1, Sub2 eller Sub3 Object alt efter hvilke slags Object der ligger på den placering i Listen.
Er det muligt at gøre det?
Eller nogen som måske har en smartere løsning?
Avatar billede arne_v Ekspert
04. april 2004 - 13:10 #1
SuperListe [] vil vel per definition returnere en Super1.

Det giver 2 muligheder:

1)  lav EnFunktion abstrakt i Super1 (virtual =0) og implementer i Sub1/2/3

2)  cast med ((Sub1)SuperListe[i]).EnFunktion()
Avatar billede mikkeljans Nybegynder
04. april 2004 - 13:49 #2
Så siger den at den ikke kan conventerer fra SuperKlasse til Sub1Klasse
Avatar billede bertelbrander Novice
04. april 2004 - 14:07 #3
#include <iostream>

using namespace std;

class SuperClass
{
public:
  virtual void f() = 0;
};

class SubClass1 : public SuperClass
{
public:
  void f()
  {
    cout << "Class 1" << endl;
  }
};

class SubClass2 : public SuperClass
{
public:
  void f()
  {
    cout << "Class 2" << endl;
  }
};


class SuperListClass
{
  SuperClass *List[10];
  int idx;
public:
  SuperListClass() {idx = 0; }
  SuperClass & operator [] (int i) { return *List[i];}
  void Add(SuperClass *p)
  {
    List[idx++] = p;
  }
};

int main()
{
  SubClass1 SC1;
  SubClass2 SC2;
  SuperListClass List;
  List.Add(&SC1);
  List.Add(&SC2);

  List[0].f();
  List[1].f();
  return 0;
}
Avatar billede arne_v Ekspert
04. april 2004 - 14:26 #4
Med cast:

#include <iostream>

using namespace std;

class SuperClass
{
};

class SubClass1 : public SuperClass
{
public:
  void f()
  {
    cout << "Class 1" << endl;
  }
};

class SubClass2 : public SuperClass
{
public:
  void f()
  {
    cout << "Class 2" << endl;
  }
};


class SuperListClass
{
  SuperClass *List[10];
  int idx;
public:
  SuperListClass() {idx = 0; }
  SuperClass & operator [] (int i) { return *List[i];}
  void Add(SuperClass *p)
  {
    List[idx++] = p;
  }
};

int main()
{
  SubClass1 SC1;
  SubClass2 SC2;
  SuperListClass List;
  List.Add(&SC1);
  List.Add(&SC2);

  (*(SubClass1 *)&List[0]).f();
  (*(SubClass2 *)&List[1]).f();
  return 0;
}
Avatar billede arne_v Ekspert
04. april 2004 - 14:27 #5
[cast syntaxen er noget pænere hvis man kører der helt med pointere, men
jeg ville lave det compatibelt med Bertels kode]
Avatar billede mikkeljans Nybegynder
04. april 2004 - 14:32 #6
OKay tror jeg forstår det nu. Tak
Avatar billede arne_v Ekspert
06. april 2004 - 22:43 #7
Med pointere:

#include <iostream>

using namespace std;

class SuperClass
{
};

class SubClass1 : public SuperClass
{
public:
  void f()
  {
    cout << "Class 1" << endl;
  }
};

class SubClass2 : public SuperClass
{
public:
  void f()
  {
    cout << "Class 2" << endl;
  }
};


class SuperListClass
{
  SuperClass *List[10];
  int idx;
public:
  SuperListClass() {idx = 0; }
  SuperClass * operator [] (int i) { return List[i];}
  void Add(SuperClass *p)
  {
    List[idx++] = p;
  }
};

int main()
{
  SubClass1 SC1;
  SubClass2 SC2;
  SuperListClass List;
  List.Add(&SC1);
  List.Add(&SC2);

  ((SubClass1 *)List[0])->f();
  ((SubClass2 *)List[1])->f();
  return 0;
}
Avatar billede arne_v Ekspert
06. april 2004 - 22:44 #8
Type casten i min første kommentar var forkert (C# og Java syntax !).
Avatar billede arne_v Ekspert
06. april 2004 - 22:44 #9
OK ?
Avatar billede arne_v Ekspert
24. april 2004 - 18:03 #10
Lukke tid ?
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