C++ Designfrage zu Verweisen

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
C++:
struct struct_M
{
   struct struct_A
   {
      double* p1;
      double* p2;
      double v1;
      double v2;
   };

   std::vector<struct_A> vec_A;
   std::vector<double> vec_d;
};
struct_M M;
std::vector<double> vec_X;

struct_M copyOf_M = M;

Hallo, ich habe mal eine Frage zu vorigem Code.
Zur Erklärung:
  • Es gibt ein vector aus structs vec_A
  • Es gibt ein vector aus doubles vec_d
  • Es gibt ein vector aus doubles vec_X
Soweit klar.
- Im Laufe des Programms können die Pointer aus struct_A im vector vec_A je nach Laufzeit völlig unterschiedlich auf Values von folgende Variablen verweisen:
- auf Variablen von vec_d (gehört im selben struct_M immer zum vec_A)
- auf Variablen von vec_X (gibt es immer nur 1x)

Eine Instanz von struct_M enthält immer vec_A und vec_d wo manche pointer von vec_A immer auf Variablen von vec_d zeigen.
Meine eigentlichen Frage ist jetzt wie kann ich diese Zusammengehörigkeit kopieren?
Denn es ist ja so, wenn ich M kopiere zu copyOf_M dann sind zwar die Pointer auf vec_X korrekt (weil das für alle am selben Ort nur 1x existiert) aber die Pointer auf vec_d sind falsch und zeigen auf vec_d von M statt auf vec_d von copyOf_M was natürlich logisch ist.

Um den Bezug vec_A und vec_d zu erhalten könnte man als Verweis im struct_A statt einen Pointer als integer den Index des vectors vec_d speichern so wäre struct_M kopierbar, aber das funktioniert leider NICHT weil eben auch Verweise nach Außen auf vec_X möglich sein müssen.

Die Frage ist also verkürzt, wie kann man eine Datenstruktur (struct_M) mit erst zur Laufzeit bekannten Verweisen gestalten, dessen Instanz kopierbar ist und dabei die inneren Verweise erhält (vec_A -> vec_d) und aber auch auf weitere äußere Variablen (vec_X) verweisen kann?

Gruß
 
Zuletzt bearbeitet:
Schau beim Kopieren einfach für jeden Pointer, ob der Pointer auf ein Element in den eigenen Vector zeigt.
Falls das der Fall ist: benutz deine Index-Variante zum Kopieren (Index bekommst du raus indem du die relative Position zum ersten Element im Vector bestimmst.)

Falls die structs, die auf d oder X zeigen disjunktive Mengen sind, wäre es eventuell schlauer die aufzusplitten.
Man könnte auch jeweils ein boolean nutzen, um abzuspeichern wohin der Pointer zeigt.

Alternativ, überarbeite das Design.
 
Zuletzt bearbeitet: (Stackoverflow-Links zum copy&pasten)
  • Gefällt mir
Reaktionen: TriggerThumb87 und T_55
Wenns so bleiben soll:
https://www.geeksforgeeks.org/copy-constructor-in-cpp/

Dh beim kopieren oder anlegen kannst du explizit machen, was du willst. Also zB auch Parameter in den ctor mit hineinreichen. Dann aber als class und nicht als struct. (0 Overhead).

Ansonsten würde ich wirklich versuchen diese Menge an (raw)Pointern zu vermindern.
Und irgendwie wirkt das Design komisch. Member einer struct in einem struct zeigen auf Speicher, der ganz wo anders liegt? Aber nur manchmal? Ich weiß nich..

Durch welche Logik wird denn entschieden, ob die beiden double-pointer auf den "inneren" Daten-Vector zeigen oder auf den äußeren?
Du könntest auch, wie du schon schreibst, mit Index- statt Pointern arbeiten und zB zusätzlich mit einem bool codieren, in welchem Vector die Daten liegen an der Stelle. Oder du hast nur einen Pointer-Vector und den Index dazu.
Muss aber nich schöner werden dadurch - nur als Ideen, die dir evtl helfen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: T_55
Danke für den Input, die Ideen mit den Hilfsbools sind super, hat mich jetzt auf die Idee gebracht einen Hilfsvector zu erstellen wo ein zweifacher Verweis drin ist 1. welches Ziel (per bool) und 2. der Index (per int) des Ziels. So könnte man sogar ganz auf Pointer verzichten was natürlich alles kopierbar macht, sehr gut 👍
 
Zurück
Oben