Arrays in Classen & nested Funktionen



  • 1. Gibt es eine Möglichkeit, verschachtelte Funktionen in C++ zu definieren? Ich habe irgendwo mal etwas gelesen, wo behauptet wurde, dass es ginge, aber beim Versuch, es umzusetzen, hat GCC gemeckert...

    2. Ich brauche in meiner Klasse folgendes Array:

    const int colorNr = 4;
    		const int colorStep = 255 / (colorNr - 1);
    		const int brightness = 64;
    		const int contrast = 64;
    
    		const unsigned char colors[colorNr] = {
    			0 * colorStep,
    			1 * colorStep + 30,
    			2 * colorStep,
    			3 * colorStep,
    		};
    

    Aber GCC beschwert sich immer darüber. Warum funktioniert es nicht?

    Thx



  • 1. Gibt es eine Möglichkeit, verschachtelte Funktionen in C++ zu definieren?

    Nein, das geht nicht.
    Es gibt einen Workaround: lokale Klasse machen, dort diese Funktion implementieren.


  • Mod

    @1: Es ist anzumerken, dass Funktionen einer lokalen Klasse keine verschachtelten Funktionen sind in dem Sinne, dass man darin Zugriff auf automatische Variablen der umgebenden Funktion hätte (es ist also kein Zugriff auf den äußeren Stackrahmen möglich) - man kann das je nach Anwendungsfall dadurch abmildern, indem man relevante Daten von vornherein zu Membern des Objekts der lokalen Klasse macht. Der Vorteil einer lokalen Klasse erschöpft sich - abgesehen von der Nähe der Definition zum benutzenden Code - im Prinzip darin, dass alle Member no linkage haben.

    Aber GCC beschwert sich immer darüber.

    worüber? Nichtstatische Member können in einer Klassendefinition nicht initialisiert werden. Dies gilt nur dann nicht, wenn es sich um konstante integrale oder Aufzählungsvariablen handelt. Das ist im Übrigen ein wiederkehrendes Thema, das in den vergangenen Tagen bereits mehrfach diskutiert wurde.



  • Danke für die Antworten!
    3. Wie greift man eigentlich auf Argumente einer Ellipse zu?



  • Hallo

    Was hat deine neue Frage mit dem ursprünglichen Threadthema zu tun?
    Ein Thema ein Thread, ein Thread ein Thema!

    Und wenn du die SuFu benutzt wirst du sicher deine Frage selber beantworten.

    bis bald
    akari



  • QBit schrieb:

    const unsigned char colors[colorNr] = {
    			0 * colorStep,
    			1 * colorStep + 30,
    			2 * colorStep,
    			3 * colorStep,
    		};
    

    Ist mir nur gerade aufgefallen, du hast am Schluss des Arrays ein Komma zu viel. Ist vielleicht nur ein Kopierfehler, aber ich dachte, ich schreibs mal 😉
    Und die Dimension colorNr musst du eigentlich nicht angeben, wenn du gerade alle Elemente initialisierst.



  • Das ist kein Kopierfehler, sogar noch nichtmal ein Fehler an sich, da es erlaubt ist, auch nach dem letzten Element ein Komma zu setzen. (Vorteilhaft für automatisch erzeugte Arrays.)



  • Sorry, dass kannte ich bisher nicht; ich dachte nicht, dass die C++ Syntax das erlauben würde, da ich mir Kommas als Trennzeichen mehrerer Werte gewohnt bin.

    QBit schrieb:

    (Vorteilhaft für automatisch erzeugte Arrays.)

    Wie meinst du das?



  • Nexus schrieb:

    QBit schrieb:

    (Vorteilhaft für automatisch erzeugte Arrays.)

    Wie meinst du das?

    zB fuer sowas

    file << "int array[] = {";
    for(iterator i=begin(); i!=end(); ++i) {
      file << *i <<",\n";
    }
    file <<"};\n";
    

    waere ohne einem erlaubten trailing , komplizierter. und komplizierter bedeutet dass man logik in generatoren einbauen muss - was nicht jeder generator anbietet.


Anmelden zum Antworten