Umgehen der fehlenden friends Deklaration

Mortal_Shadow

Aktives Mitglied
Hi,

zuerst einmal was ich machen will:
Ich bin dabei ein Programm zu schreiben, welches mir verschiedene 3d-Modelle einliest und per Opengl zeichnet.
Um mir Aufrufe bezüglich der pipeline zu sparen (z.B. durch Textur.bind()) will ich mir eine Art DrawManager schreiben, dem ich erstmal alle Objekte übergebe, die ich zeichnen will und der sie dann anordnet befor er sie malt.
Auch passt er auf, falls z.B. zwei Modelle teilweise die gleiche Textur benutzen, diese nur einmal zu laden.
Dazu ist es natürlich notwendig, dass alle Modelle über ihn geladen werden.

Des weiteren unterscheide ich zwischen zwei Klassen:
MSDrawable und MSDrawableIntern.
Letztere wird jeweils nur einmal geladen und jedes MSDrawable hat eine Referenz auf das zugrundeliegende MSDrawableIntern, sowie Informationen über Position, Rotation, usw.

Wie gesagt, müssen aber alle MSDrawableIntern über den DrawManager geladen werden.
Die Klasse ode zumindest ihr Konstruktor sollten also nicht public sein.

Des weiteren habe ich loader für (bisher zwei) verschiedene Dateiformate.
Da diese viele Klassen besitzen (weil die Formate auf Chunks basieren und so das laden viel leichter umzusetzen war, pro Chunk eine Klasse), sind die jeweils in ihrem eigenen Package.

Sie können nun folglich nicht auf einen Konstruktor für MSDrawableIntern zugreifen, sofern ich nicht mein Projekt komplett unübersichtlich mache indem ich alles in ein Package stopfe.

Was mache ich nun am besten?
Mfg.
 
Wäre sowas eine Alternative?
Java:
public MSDrawableIntern(DrawManager dm) {
  // register this object at the given draw manager
}
 
Führt leider auch zu unschönheiten.
Erklärung meines Projektaufbaus:

Package_1:
An8Loader
Klassen für Chunks (An8Loader braucht sie, visibility default, da niemand auserhalb des Packages die will)

Package_2:
Wie 1 mit anderer Dateiendung

Package_3
DrawManager
MSDrawableIntern
MSDrawable

------------
MSDrawableIntern enthält die Daten, die später nicht mehr verändert werden sollen/können.
Die Loader müssen aber drauf zugreifen können um sie zu initialisieren.
Eine Lösung wäre ja, MSDrawableIntern ein boolean isSetup zu verpassen sowie public Methoden zum verändern, die halt nicht mehr gehen wenn isSetup == true.
Finde ich aber auch hässlich.

------------------------------------------

Trotzdem ist mir eine Lösung gekommen:
MSDrawableIntern abgelöst durch eine public Variante MSModel.
Wenn ich nun DrawManager.load() aufrufe, speichert er das MSModel in einer ArrayList ab und gibt nur den Index zurück.
Auf diese Weise verhindere ich späteren zugriff auf das Modell.

MSDrawable enthält folglich auch nicht mehr eine Modellreferenz sondern einen Index.

Ein Modell irgendwie zu erstellen und dem DrawManager zu übergeben ist dann auch möglich, er speichert dann eine Kopie des Modells (um spätere veränderungen zu umgehen) ab und gibt ebenfalls einen Index zurück.

Müsste eigentlich funktionieren, die Umsetzung wird aber erst morgen angefangen^^.

Auf jeden Fall danke fürs reinschauen und mfg.

Bei alledem, die Entscheidung keine "friends" zu erlauben ist definitiv eine die ich nicht mag^^.
Zumindest in sub-packages sollte es möglich sein 😛
 
Zuletzt bearbeitet:

Zurück
Oben