Seite 1 von 1

Klasse mit Datentyp "auto"

Verfasst: 24.12.2019, 16:26
von starcow
Tach Zusammen (-:

Ich wollte eben eine kleine Klasse erstellen, die in einem bestimmten Kontext universell einsetzbar ist.
Dabei ist die Klasseninstanz ein Element einer Kette und zeigte jeweils auf seine "Nachbarsglieder" (Instanzen gleicher Klasse).
Allerdings soll der Zeiger "Parent" und "Target" universell gehalten sein, sprich, es soll möglich sein, erst zur Laufzeit festzulegen, welcher Art die Objekte sind, auf die gezeigt wird.
Ich dachte dabei an "auto", doch das scheint nicht zu funktionieren. Lässt sich das ganze trotzdem irgendwie realisieren?

Code: Alles auswählen

class CLS_ChainLink {
private:
	CLS_ChainLink* Next;
	CLS_ChainLink* Previous;
	auto Parent; // "Parent" und "Target" sollen flexibel sein und je nach Situation...
	auto Target; // ... auf verschiedenartige Objekte zeigen können.
}
Gruss starcow

Re: Klasse mit Datentyp "auto"

Verfasst: 24.12.2019, 17:24
von xq
Hey starcow,

zuerst dachte ich an templates, aber:
starcow hat geschrieben:es soll möglich sein, erst zur Laufzeit festzulegen, welcher Art die Objekte sind, auf die gezeigt wird.
Hierfür brauchst du entweder Vererbung, wenn dein Parent oder Target eine gemeinsame Basisklasse haben oder aber einen std::variant, was ähnlich wie eine Union funktionieren soll.

Was möchtest du denn erreichen?

Re: Klasse mit Datentyp "auto"

Verfasst: 24.12.2019, 18:43
von starcow
Hi xq :-)

Stimmt, Vererbung wäre natürlich eine Möglichkeit. Derzeit gibt es allerdings nur zwei verschiedene Arten, auf die "Parent" / "Target" zeigen können. Und wenn ich eine Basisklasse anlege, habe ich in der Summe wieder gleich viele Klassen angelegt, wie wenn ich separate Klassen erstellt hätte - nämlich zwei (zumindest bis jetzt). :-).

Die Elemente der Klasse sollen eine Kette bilden. Wichtig ist dabei, dass ich direkt auf ein Element der Kette per Zeiger zugreifen kann.
So hat also jedes Element einen "Next" und einen "Previous" Zeiger, also Zeiger auf die Nachbar-Elemente. Zudem sollen aber diese Elemente auch ein tatsächliches "Target" per Zeiger anvisieren können. Dieses Target soll dann nach Möglichkeit ein frei wählbares Objekt sein. Dabei wäre es natürlich nett, wenn ich nicht verschiedene Klassen anlegen müsste, nur um dann den Datentyp des "Target-Pointers" jeweils abzuändern.
Ich hoffe, man versteht, was ich meine :-X.
Das ganze brauche ich, um meine Elemente in einem Grid (spatial-hasing) registrieren zu können.

Gruss starcow

Hey, es ist Weihnachten! Ich wünsche allen ein frohes Fest! :-D

Re: Klasse mit Datentyp "auto"

Verfasst: 24.12.2019, 22:53
von scheichs
Frohe 🎄!

Re: Klasse mit Datentyp "auto"

Verfasst: 25.12.2019, 21:25
von Jonathan
C++ hat halt ein statisches Typsystem, da gibt es kein 'zur Laufzeit'. Vereinfacht gesagt kopiert 'auto' den Typ von der Initialisierung, du musst das Objekt also erstens direkt initialisieren und zweitens ist der Typ danach genau so statisch.

So viel Arbeit ist eine Basisklassendefinition ja auch nicht. Und die Frage ist halt auch, was du dir vorstellst, wie das ganze am Ende überhaupt funktionieren soll. Um die Zeiger später benutzen zu können, musst du ja definieren, was so ein Zeiger können soll.

Du könntest natürlich auch void*-Zeiger benutzen und die mittels reinterpret_cast jeweils auf den passenden Objekttyp umbiegen. Allerdings ist das von der Benutzung her halt auch nicht so dolle, weil du ständig Fallunterscheidungen schreiben musst und auch irgendwie sicherstellen willst, dass es nicht ständig abstürzt. Letztendlich dürfte Vererbung hier tatsächlich die netteste Lösung mit dem kompaktesten Code sein.

Re: Klasse mit Datentyp "auto"

Verfasst: 26.12.2019, 11:39
von starcow
Achso, verstehe! Ich hatte da ganz grundsätzlich eine falsche Vorstellung von "auto". Danke für die Korrektur! :daumen: :-)

Gruss starcow