C++ Referenz in Klasse initialisieren

Sephizero

Grünschnabel
Hallo,

ich weiß, dass es hier bereits ein ähnliches Thema gab, doch leider konnte es mir meine Frage nicht zufrieden stellend beantworten.

Ich habe eine Klasse, die als Eigenschaft ein Vector gefüllt mit Punkten mit jeweils 3 Koordinaten besitzt:


Code:
class tbody
{
  public:
  //methoden
  private:

  std::vector<tvertex> vertices;

};

Diese Klasse soll nun einen weiteren Vector als Eigenschaft besitzen, der mit Polygonen gefüllt wird (Dreiecke). Da es sich hier um sehr sehr viele Punkte handelt, möchte ich in dem Polygon nur die Referenz auf die Punkte speichern, anstatt jedes Polygon mit den Punkten zu füllen.

Jetzt zu meinem Problem. Ich bin erst seit einigen Tagen beim C++ programmieren und somit noch nicht sehr firm mit der Sprache. Ich habe gelesen, dass man in c++ lieber Referenzen benutzen sollte als Pointer. Also habe ich versucht einen struct zu definieren:

Code:
struct tpolygon
{
		tvertex& v1;
		tvertex& v2;
		tvertex& v3;
		tvertex& center;
};

Jedoch beschwert sich der Kompiler bei der initialisierung:
Code:
tpolygon polygon_in
über einen fehlenden geeigneten Konstruktor.

So wie ich dass jetzt sehe, liegt das daran, dass bei der Initialisierung die Referenzen tvertex& v1 ... etc. nicht definiert sind.
Meine Frage ist, wie kann ich diese initialisieren. Denn die Referenzen sind erst zur Laufzeit, also beim konstruieren des tpolygon bekannt. Aber auch das umschreiben in eine Klasse mit einem Konstruktor, der die Referenzen als Parameter benötigt, half mir noch nicht weiter (Pseudocode):
Code:
class tpolygon
	{
	public:
		tpolygon(tvertex& v_1, tvertex& v_2, tvertex& v_3, tvertex& _center);
		~tpolygon();

	private:
		tvertex& v1; 
		tvertex& v2;
		tvertex& v3;
		tvertex& center;

	};

Ich hoffe, ihr könnt mir vielleicht helfen.

Viele Grüße
 
Hi.

Das wird mit Referenzen nicht funktionieren.

Referenzen müssen initialisiert werden und können später nicht mehr geändert werden.

Eine Bedingung für Objekte in einem STL Container ist, dass die Objekte einen Standardkonstruktor besitzen (was für deine Polygon Objekte nicht möglich ist, da du dann an der Stelle auch die Referenzen initialisieren müßtest).

Entweder du verwendest Zeiger, oder eine Smartpointer Implementierung wie z.B. boost::shared_ptr bzw. boost::weak_ptr.

Oder du verwendest das Flyweight Muster - z.B. über Boost.Flyweight.

Bitte poste immer gleich direkt die Fehlermeldungen des Compilers und versuche nicht eine Interpretation der Fehlermeldung anzugeben.

Gruß
 
Vielen Dank für die Antwort.

Ich hatte mich inzwischen damit beholfen, einen Konstruktor zu definieren, der sofort die Werte initialisiert. Jedoch macht auch dann std::vector mir einen Strich durch die Rechnung, da tpolygon mit Referenzen keinen standard 'operator=' mehr besitzt.
Muss ich also doch zurück zu den Zeigern =)

Danke und Gruß

Sephi
 
Ich hatte mich inzwischen damit beholfen, einen Konstruktor zu definieren, der sofort die Werte initialisiert.
Du meinst einen Standardkonstruktor? Womit hast du denn da initialisiert?
Jedoch macht auch dann std::vector mir einen Strich durch die Rechnung, da tpolygon mit Referenzen keinen standard 'operator=' mehr besitzt.
Vielmehr kann in diesem Fall kein operator= generiert werden. Aber den könntest du ja selbst definieren.

Gruß
 
Zuletzt bearbeitet:
Zurück