Viele Erwachsene wissen auch, dass die Welt ungerecht ist. Aber wir können es auch nicht wirklich ändern. Das aktuelle System hat sich mehr oder weniger bewährt, da will man eben nicht allzu viel ändern, aus Angst, dass etwas Schlimmes passiert.

Wir schaffen es ja nicht einmal, das Geld gerechter zu verteilen. Ein paar Milliardäre haben zusammen so viel wie die ärmere Hälfte der Bevölkerung.

...zur Antwort

C++ Boost::serialization und Vector mit Pointern auf Member-Variablen?

Hallo,

ich habe eine Class "TreeNode", die serialisiert werden soll:

class TreeNode
{
private:
	friend class boost::serialization::access;
	template<class Archive>
	void serialize(Archive& ar, const unsigned int version);


protected:
	const std::string _Prefix;
	std::vector<BotVariable*> _Variables;
	
public:
	TreeNode(std::string const& Prefix, std::vector<BotVariable*> const& Variables)
		: _Prefix(Prefix), _Variables(Variables) {}
};

"BotVariable" ist eine polymorphe Klasse. Z.B. erben "DoubleVariable" und "IntVariable" von dieser Klasse.

Eine Klasse, die von TreeNode erbt, soll nun mehrere dieser DoubleVariablen und IntVariablen enthalten. Und da ich eine Liste aller Variablen eines "TreeNodes" benötige, speichere ich Pointer auf diese Variablen in _Variables. Das sieht dann ungefähr so aus:

class FishIndicatorsTreeNode : public TreeNode
{
private:
	friend class boost::serialization::access;
	template<class Archive>
	void serialize(Archive& ar, const unsigned int version);

public:
	DoubleVariable PARAM_HANDS_VPIP_PFR_RATIO_HIGH;
	DoubleVariable PARAM_HANDS_VPIP_VERY_HIGH;

	FishIndicatorsTreeNode() : TreeNode("FishIndicators",
		{ &PARAM_HANDS_VPIP_PFR_RATIO_HIGH,
		  &PARAM_HANDS_VPIP_VERY_HIGH,
		})
	{}
};

Ich glaube, es geht nicht anders, den _Variables-Vektor zu initialisieren, als alle Variablen der Klasse noch mal explizit aufzuschreiben.

Nun gut, das Problem ist aber die serialize-Funktion. Und zwar würde ich, wenn ich den _Variables-Vektor schon mal habe, ihn auch für die Serialisierung nutzen. So in etwa:

void serialize(Archive& ar, const unsigned int version)
{
  ar& _Variables;
}

Das funktioniert aber nicht. Er nimmt sich den _Variables-Vektor und speichert die dereferenzierten Objekte korrekt ab (und bestimmt nebenbei auch den echten Typ, also castet BotVariable zu DoubleVariable oder IntVariable).

Aber wenn er sie wieder lädt, dann erzeugt er neue Objekte von DoubleVariable oder IntVariable und speichert die Pointer darauf in _Variables. Das möchte ich nicht. Ich möchte, dass er die Pointer unangetastet lässt und die Objekte in den Daten speichert, auf die die Pointer zeigen. Sonst enthält der _Variables-Vektor ja nicht mehr die Pointer auf die Klassenmember, die ich im Basis-Konstruktor initialisiert habe. Also nach dem Laden enthält der _Variables-Vektor zwar einen Pointer auf die richtigen Daten, z.B. auf PARAM_HANDS_VPIP_PFR_RATIO_HIGH, aber die Klassenvariable "DoubleVariable PARAM_HANDS_VPIP_PFR_RATIO_HIGH" enthält diese Daten nicht! Es existieren beide Daten parallel.

Es funktioniert eine Möglichkeit:

void serialize(Archive& ar, const unsigned int version)
{
   ar& PARAM_HANDS_VPIP_PFR_RATIO_HIGH;
   ar& PARAM_HANDS_VPIP_VERY_HIGH;
}

Aber die finde ich sehr unschön und fehleranfällig, weil ich dann, um eine neue DoubleVariable oder IntVariable der Klasse hinzuzufügen, gleich an drei Stellen ihren Namen angeben muss: in der Klasse als Klassenvariable, im Konstruktor und in der serialize-Funktion.

Gibt es eine bessere Möglichkeit?

...zur Frage

Was du dir denkst, funktioniert so nicht. Bei der Serialisierung sollen die Daten ja für später gespeichert werden und dann existieren die ursprünglichen Objekte nicht mehr. Deswegen werden neue erzeugt.

Zudem sehe ich bei deinem Ansatz potenzielle Memory-Leaks.

...zur Antwort

Du brauchst einen Konstruktor ohne Parameter, sonst geht es nicht mit Arrays - es sei denn, du schreibst eine eigene Methode, die alle Elemente mit einem Wert initialisiert, siehe hier: https://stackoverflow.com/a/57757301

Das wurde wohl im C++-Standard vergessen oder bewusst nicht eingeführt, auch wenn ich es nicht nachvollziehen kann. Bei std::vector geht es ja auch...

Generell ist es nicht ratsam, eine Variable zu erstellen, ohne sie direkt mit den richtigen Werten zu initialisieren. Hier ist es aber wohl die einfachste Methode.

Füg einfach

position() = default;

als Konstruktor zur Klasse hinzu, dann geht es.

...zur Antwort

Den Punkt aus dem String entfernen und als Integer einlesen. Vorher sicherstellen, dass genau 2 Ziffern hinter dem Punkt sind.

...zur Antwort

https://www.deutschepost.de/de/f/frankierung/tipps-frankierung.html

Wird wahrscheinlich trotzdem an dich geschickt, wenn du deutlich näher dran wohnst als der "Absender", und du musst das dann bezahlen.

...zur Antwort

Weil er dumm war und weil es bei den Leuten gut ankam, da sie leicht auf sowas hereinfallen, weil das Bildungssystem da drüben so schlecht ist.

Ich hab heute übrigens gelesen, dass Menschen, die Schwierigkeiten bei mentalen Aufgaben haben, eher extremistische Ansichten haben: https://www.theguardian.com/science/2021/feb/22/people-with-extremist-views-less-able-to-do-complex-mental-tasks-research-suggests

...zur Antwort

Im safe mode starten, siehe hier: https://android.stackexchange.com/questions/39228/how-can-i-reset-my-developer-options-or-otherwise-boot-my-galaxy-s2-on-cm10-1-a

...zur Antwort

Warte, du hast da 2 Löcher? Geh mal zum Urologen. Ist wahrscheinlich nichts Schlimmes, aber ich würde es definitiv untersuchen lassen.

Vermutlich ist es eine Fistel: https://de.wikipedia.org/wiki/Fistel

...zur Antwort

Du animierst einfach ab einer bestimmten Scroll-Position den Offset (top) des Headers, der da eingeblendet wird, indem du die CSS-Klasse mit Javascript änderst. Googel doch mal "animated header" oder so.

...zur Antwort

Das ist wirklich dumm gelaufen, das hättest du vor dem Abbiegen fragen sollen, aber ich kann den Fehler zumindest nachvollziehen. Durchgefallen bist du trotzdem, weil du in der Prüfung nicht als Anlieger/Anwohner giltst.

...zur Antwort

Ich denke nicht, dass das irgendwen interessiert. Und selbst wenn, wieso sollten die deiner Mutter eher glauben als dir?

...zur Antwort

Genau das ist ja dein Job. Du musst dich durchsetzen können. Wenn du kompetent wirkst, wirst du auch akzeptiert. Anders wird das nichts.

...zur Antwort

Da hilft nur Anprobieren. Vielleicht mal eine andere Marke probieren. Oder Echtleder, das ist etwas dehnbar.

...zur Antwort
Meine Endote ist 2,4 und Ich mache mir Sorgen, ob ich an der RWTH Aachen Informatik studieren kann oder nicht

Das reicht locker. Informatik ist an den meisten Unis sogar zulassungsfrei. Im schlimmsten Fall studierst du einfach woanders.

Ohne Link zu der Seite kann ich dir aber die restlichen Fragen nicht beantworten.

...zur Antwort