[C++] Variablen in Datei abspeichern und wieder auslesen

Jetzt hole ich das Thema schon zum zweiten Mal aus den tiefen des Forums. ;) - Irgendwie ist dies bei mir untergegangen.

Da ich die obigen Fragen nicht unbeantwortet stehen lassen möchte ersteinmal dazu. ;)
Die Methode steuerelemente_aktualisieren() wird natürlich nicht im Konstruktor aufgerufen, da dies zu diesem Zeitpunkt auch keinen Sinn machen würde.
Diese wird zum Beispiel aufgerufen, wenn ein Einstellungs-File geladen wird, wodurch sich natürlich sämtliche Werte ändern. Die Methode steuerelemente_aktualisieren(int gruppe) wird dagegen zum Beispiel aufgerufen, wenn nur in einem bestimmten Bereich Änderungen vorkommen, wobei hier dann jeweils nur entsprechende Funktionen betroffen sind, die die jeweilige Gruppennummer in der Struktur besitzen.
Damit es zu keinen Fehlzugriffen kommt wird bei kritischen Funktionen auch noch innerhalb der Funktion überprüft, ob beispielsweise die betroffenen Objekte auch schon/noch in der Form vorhanden sind.

Und wo das ganze nun schon wieder ausgegraben ist gleich noch eine weitere Frage:
Ist es möglich, mit einem Pointer, der auf eine Funktion mit einem Parameter (bspw.:void (*funktion)(int) ) zeigt, auch Funktionen mit weiteren, optionalen Parametern zuzuweisen (bspw.: void beispielfunktion(int x, int y = 0) oder void beispielfunktion2(int x, int y = 0; string z = "beispiel") )?

Der Hintergrund dabei ist, dass Elemente der Map mit obiger Struktur auch auf Funktionen verweisen sollten, die mehrere optionale Parameter besitzen.
Natürlich kann ich nun noch eine weitere Funktion definieren, die dann die entsprechende Funktion aufruft, doch wäre der direkte weg natürlich besser.
Allerdings vermute ich einmal, dass dies aufgrund des Grundprinzips der Zeiger nicht möglich sein wird.

MfG mh1001
 
Ich habe es nicht ausprobiert, aber warum sollte es nicht gehen?

Die Parameter sind ja nicht wirklich optional. Die Parameter sind nur eben vorbelegt und müssen nicht explizit mit übergeben werden.

MfG

Arnd
 
Leider klappt das ganze nicht. Zumindest nicht in der Form wie angesprochen - eventuell habe ich mich oben aber auch unverständlich ausgedrückt. ;)

Ich habe das ganze eben noch einmal an folgendem Beispielcode getestet:

Code:
#include <iostream>

void beispielfunktion_1(int x)
{
  std::cout << "Beispielfunktion 1 wurde mit " << x << " aufgerufen" << std::endl;
}

void beispielfunktion_2(int x, int y = -1)
{
  std::cout << "Beispielfunktion 2 wurde mit " << x << " aufgerufen" << std::endl;
}

void beispielfunktion_3(int x, bool y = false)
{
  std::cout << "Beispielfunktion 3 wurde mit " << x << " aufgerufen" << std::endl;
}

int main(int argc, char** argv)
{
  // Pointer festlegen

  void (*pointer_1)(int) = beispielfunktion_1;  // funktioniert natürlich
  void (*pointer_2)(int) = beispielfunktion_2;  // führt zu einem Fehler, s.u.
  void (*pointer_3)(int) = beispielfunktion_3;  // führt ebenenfalls zu einem Fehler


  beispielfunktion_1(1);
  beispielfunktion_2(1);
  beispielfunktion_3(1);

  // Fenster offenhalten

  char z;

  std::cin >> z;

  return 0;
}

Mein Compiler (GCC 3.4.2) sagt nun folgendes dazu:

Code:
23   invalid conversion from `void (*)(int, int)' to `void (*)(int)'
24   invalid conversion from `void (*)(int, bool)' to `void (*)(int)'

MfG mh1001
 
Ja, das ist absolut korrekt. Die Funktion hat eine andere Signatur und kann daher nicht gecastet werden. Ob Parameter dabei Defaults haben interessiert dabei nicht.

Ein sogenannter Stub um die eigentliche Funktion, der die Defaultparameter belegt, sollte es tun für dich. Alternativ lassen sich hier auch Binder einsetzen. Allerdings arbeiten die mit nicht unbedingt intuitiv verständlichen Templates. Die wären für deinenZweck dann wohl etwas "oversized".
 
Mal als Vorschlag:

Code:
#include <iostream>

void beispielfunktion_1(int x)
{
  std::cout << "Beispielfunktion 1 wurde mit " << x << " aufgerufen" << std::endl;
}

void beispielfunktion_2(int x, int y = -1)
{
  std::cout << "Beispielfunktion 2 wurde mit " << x << " aufgerufen" << std::endl;
}

void beispielfunktion_3(int x, bool y = false)
{
  std::cout << "Beispielfunktion 3 wurde mit " << x << " aufgerufen" << std::endl;
}

int main(int argc, char** argv)
{
  // Pointer festlegen

  void (*pointer_1)(int)         = beispielfunktion_1;  // funktioniert natürlich
  void (*pointer_2)(int,int)    = beispielfunktion_2;  // führt zu einem Fehler, s.u.
  void (*pointer_3)(int,bool) = beispielfunktion_3;  // führt ebenenfalls zu einem Fehler
...

Das kompiliert zumindest bei mir.

MfG

Arnd
 
@7H3 N4C3R

Das hatte ich mir schon fast gedacht. ;) Dann wird mir wohl nichts anderes übrig bleiben als auf eine der anderen Varianten auszuweichen.

@Arnd

Das wäre natürlich das einfachste. Jedoch ist dies in meinem Fall nicht möglich, da der Pointer von vorneherein schon in der Struktur in der obigen Map festgelegt ist und somit für jedes Element natürlich identisch ist.

MfG mh1001
 
Zurück
Oben