Zum Inhalt springen

Klasse für dynamisches array / hilfe


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe folgendes Problem:

Gesucht ist eine Klasse TypelessSortedDynArray;

Wie der Name schon sagt soll die Klasse ein dynamisches Array darstellen, dass Objekte von der Klasse CompareableInt, CompareableStrin usw. aufnehemen kann, die von der abstrakten Klasse Compareable erben.

Also das ganze ist jetzt noch nicht sortierte, will einfach mal Elemente einfügen können, vorerst nur int;

class Compareable

{

public:

virtual int compareTo(Compareable*) = 0;

virtual int get() const = 0;

};

class CompareableInt: public Compareable

{

public:

int compareTo(Compareable*);

void set(int);

int get() const { return x; };

private:

int x;

};

class TypelessSortedDynArray

{

private:

Compareable *a;

int num;

public:

TypelessSortedDynArray()

{

num = 0;

a = NULL;

}

~TypelessSortedDynArray()

{

if(a != NULL)

delete [] a;

}

Compareable* elementAt(int index) const;

void add(int);

int get(int index)

{

CompareableInt *temp = dynamic_cast <CompareableInt *> (&a[index]);

return temp->get();

}

};

void TypelessSortedDynArray::add(int value)

{

CompareableInt temp;

temp.set(value);

std::cout << temp.get() << " ";

if(a == NULL)

{

a = new CompareableInt;

num = 1;

}

else

{

num++;

a = (Compareable*)realloc(a, sizeof(a) + sizeof(CompareableInt));

}

a[num-1] = temp;

}

void CompareableInt::set(int value)

{

x = value;

}

Wenn ich jetzt folgendes Hauptprogramm verwende:

int main()

{

TypelessSortedDynArray array;

array.add(20);

std::cout << array.get(0);

}

bekomm ich folgende Ausgabe:

20 10027204

//20 ist der Wert der eingefügt wird und die andere Zahl ist mein Problem :)

Hat villeicht jemand ne ahnung was da nicht stimmt?

Entweder überseh ich was oder, naja weiß auch nicht ...

Geschrieben

Du kannst hinter einem Compareable* kein Array von Objekten einer abgeleiteten Klasse ablegen, das funktioniert nur in speziellen Ausnahmefällen.

Und auf gar keinen Fall darfst du realloc für Speicher benutzen, der nicht mit new angefordert wurde. Auf die C-Speicherverwaltungsfunktionen solltest du komplett verzichten, wenn du mit C++-Klassen arbeitest, weil malloc & Co. nichts von Klassen wissen, und dementsprechend auch keine Konstruktoren aufrufen.

Geschrieben

Ja einschränkungen hab ich eigentlich schon ... ^^

sollte eigentlich nichts von dem oben genannten verwendet werden...

mehr oder weniger sollte der kern der sache einfach nur ein voidpointer sein ...

Geschrieben
mehr oder weniger sollte der kern der sache einfach nur ein voidpointer sein ...
Dann muss dieser Voidpointer auf ein dynamisch alloziiertes Array von Compareable* zeigen (also ein Array von Zeigern).

Und verpass Compareable einen virtuellen Destruktor. Du wirst die Objekte über einen Basisklassenzeiger freigeben müssen, und nur so kannst du sicherstellen, dass der Destruktor der abgeleiteten Klasse auch aufgerufen wird.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...