Hi Leute
Mal wieder ein kleines Problem bei dem ich mich als Anfänger total
überfordert sehe.
Ich habe hier eine Funktion die mir einige Dinge erledigen soll.
Dem zu Grunde liegen verschiedene Objekte, hier im Besispiel einmal zwei
Objekte, einmal eine Audiodatei und einmal eine Grafikdatei.
Für die Audiodatei brauche ich folgende infos als enum:
-Bitrate
-Zielformat
Für die Grafik brauche ich folgende infos als gemischt:
-Größe x (als int)
-Größe y (als int)
-Zielformat (als enum)
Meine Funktion soll z.B. so aussehen
Also bestimmend durch das enum QUELLE muß jeweils ein anderer
Konstruktor verwendet werden, welcher dann aus weiteren enums oder ints
oder strings besteht.
Könnte mir jemand mal bitte mit einem Codebeispiel weiterhelfen und ganz
kurz erläutern um was ews sich dann dabei handelt?
Mit Konstruktoren kann man so viel machen ...
Wenn möglich bitte so "einfach wie möglich", auch wenn es dann nicht die
100% beste Lösung ist. Ich möchte wenigstens einigermaßen verstehen was
da passiert, das ist manchmal dann sehr schwierig wenn man den 100%
besten Weg geht ...
MFG
Marco
Mir ist nicht klar, was Du meinst.
Wenn Du meinst, dass Du dieselbe Funktion (d.h. gleichnamige) mit
unterschiedlichen Parametern aufrufen kannst und dann je nachdem ein
anderer Funktionsrumpf aufgerufen wird, dann meinst Du "Funktionen
überladen".
D.h. Du definierst einmal die Funktion
Der Compiler sorgt dann dafür, dass beim Aufruf mit den Parametern
(QUELLE, Bitrate, Zielformat) die erste wandle() aufgerufen wird und bei
(QUELLE, int, int, Zielformat) die zweite wandle().
Dies geschieht aber nicht (zur Laufzeit) aufgrund des Wertes von QUELLE,
sondern zur Compilierzeit aufgrund der Parameterliste.
Mit Konstruktoren hat dies nichts zu tun.
Tut mir leid das ich mich nicht deutlicher Ausdrücken kann ...
Also im Grunde hätte ich gerne eine Funktion die lediglich "wandle"
heißt.
Was diese Funktion jedoch umwandeln soll entscheidet sich erst während
der Laufzeit.
Jenachdem was sich da dann ergibt ist es halt eine Audiodatei oder eine
grafikdatei. Beide DInge brauchen aber halt andere Parameter die zum
umwandeln (durch die funktion "wandle") benötigt wird.
Man könnte auch einfacher sagen:
Ich möchte durch die funktion "wandle" quasi eine Art String erzeugen
wie man das quasi bei einem cli-Programm benötigt, halt nur mit
Parametern die abhängig von dem zu wandelnden Objekt sind und
dementsprechend teilweise (durch meine gewünschten enums) feste
auswählbare Werte haben.
Zudem ist mir wichtig, das ich nicht vergesse einenc der benötigten
Parameter anzugeben.
Da es nachher viele Quellen zum "wandeln" gibt hätte ich das gerne
"Idiotensicher", ich weis ja schließlich wer hier vorm Bildschirm sitzt
;-))
Ich könnte natürlich auch sowas hier machen:
Mir geht es darum zu versuchen das "wandle_audiodatei" und
"wandle_grafik" durch "wandle (QUELLE.AUSWAHL), ..." zu ersetzen (sofern
das möglich ist).
Hoffe ich konnte es jetzt besser "erklären".
MFG
Marco
Marco K. wrote:
> Also im Grunde hätte ich gerne eine Funktion die lediglich "wandle"> heißt.
OK, verstanden.
> Was diese Funktion jedoch umwandeln soll entscheidet sich erst während> der Laufzeit.
Bist Du sicher?
> Jenachdem was sich da dann ergibt ist es halt eine Audiodatei oder eine> grafikdatei. Beide DInge brauchen aber halt andere Parameter die zum> umwandeln (durch die funktion "wandle") benötigt wird.
OK.
> Man könnte auch einfacher sagen:> Ich möchte durch die funktion "wandle" quasi eine Art String erzeugen> wie man das quasi bei einem cli-Programm benötigt, halt nur mit> Parametern die abhängig von dem zu wandelnden Objekt sind und> dementsprechend teilweise (durch meine gewünschten enums) feste> auswählbare Werte haben.> Zudem ist mir wichtig, das ich nicht vergesse einenc der benötigten> Parameter anzugeben.
Kannst Du quasi ein Beispiel für die Audiodatei und für die Grafik
machen?
> Ich könnte natürlich auch sowas hier machen:>>
>> Mir geht es darum zu versuchen das "wandle_audiodatei" und> "wandle_grafik" durch "wandle (QUELLE.AUSWAHL), ..." zu ersetzen (sofern> das möglich ist).
Ist möglich, warum nicht? Sofern das, was bei ", ..." steht sich
unterscheidet, merkt der Compiler, welche wandle() gemeint ist (zur
Compilierzeit).
Ich habe noch nicht verstanden, weshalb Du die Auswahl der Funktion
wandle() erst zur Laufzeit willst.
Du musst ja ohnehin bereits zur Compilierzeit festlegen, um was es sich
handelt (Audiodatei/Grafik), weil Du ja für die Grafik keine Bitrate und
für die Audiodatei keine Koordinaten angeben wirst, oder?
>>Du musst ja ohnehin bereits zur Compilierzeit festlegen, um was es sich>>handelt (Audiodatei/Grafik), weil Du ja für die Grafik keine Bitrate und>>für die Audiodatei keine Koordinaten angeben wirst, oder?
Genau da liegt mein Problem:
Der Benutzer des Programmes entscheidet erst zur Laufzeit was er gerne
wandeln möchte ... das weis ich jetzt halt noch nicht, das geschieht
halt erst dynamisch zur Laufzeit.
Und es ist auch richtig, das ich bei einer Grafik nichts mit der Bitrate
anfangen kann, deshalb möchte ich das ja gerne irgendwie "kapseln".
Die Werte für diese Parameter kommen nachher aus der GUI, wobei ich
gerade überlege ob ich nicht auch einfach meine selbsterstellte
Schaltfläche (welche diese Parameter alle enthält) an meine Funktion
"wandle" übergeben sollte ... das müßte doch auch gehen.
Bei der audiowandlung kommt es nachher z.B. noch darauf an, um was es
sich da genau handelt (wav, mp3, flac, ...).
Deshalb heißt es nachher dann auch QUELLE.wav, QUELLE.mp3, QUELLE.flac
... nur für jede Art von Quelle brauche ich andere Parameter die
zwingend notwendig sind.
Die Quellen (wav, flac, mp3) sollen wenn möglich als Auswahl bereit
stehen, damit ich nur einen Anlaufpunkt habe wenn später mal ein neues
Format (mit wiederrum neuen Parametern) hinzukommt. Deshalb mein "Enum".
Zumal gibt es bei den Parametern bestimmte Grenzen (z.B. int minimum =
32, int maximum = 128 ...), da würde ich gerne durch Auswahl (Enum)
verwindern dsa ich da Zahlen programmiere die nicht möglich sind. Auch
hier wiederrung nur eine einzige Anlaufstelle wenn ich die Werte mal
weiter einschränken oder erweitern sollte.
Mir geht es hier natürlich nur in etwa ums Prinzip, wenn es z.B. statt
der enums auch anders geht ist mir das auch recht ... ich wüßte es
erstmal nicht anders umzusetzen. Deshalb meine Frage an Profis ...
Deshalb meine Frage ob mans noch etwas schöner hinkriegt, als meine
(wohl funktionierende) Lösung es handhaben würde.
Wie gesagt, ich bin totaler Anfänger, ist halt nicht so einfach wenn man
nicht genau weiß wie man es lösen kann, wobei es viele Wege gibt.
MFG
Marco
Marco K. wrote:
> Der Benutzer des Programmes entscheidet erst zur Laufzeit was er gerne> wandeln möchte ... das weis ich jetzt halt noch nicht, das geschieht> halt erst dynamisch zur Laufzeit.
Ja, aber Du musst doch bereits zur Compilierzeit pro Dateityp festlegen,
was mit den Parametern geschehen soll.
Also immer dann, wenn es sich z.B. um eine MP3 Datei handelt, sollen die
Parameter soundso übergeben werden und die haben dieunddie
Wertebereiche.
Schliesslich wirst Du ja Programmcode schreiben für die Wandlung, und
der ist je nach Dateityp anders, oder?
Vielleicht machst Du mal ein konkretes Beispiel mit Audio und Grafik
inkl. dessen, was in wandle() geschieht.
"kein Problem" werd ich aber heute nicht mehr schaffen, zumal ich noch
nicht mal genau weis, wie ich innerhalb dieser Funktion überhaupt
weitergehen möchte ... es fehlt halt die "Routine" :-)
Vielen Dank schonmal bis hierhin!
MFG
Marco
es klingt als würde dein inneres nach einer polymorphie streben.
mach Source als Oberklasse für Image,Audio,...
mach irgendwo abstrakte(virtuelle) Funktion convert(Source)
und implementiere es je nach Source.
das ganze herumwirbeln mit enums errinnert mich an switch
nachbildung einer polymorphie.
--
daniel