Defaultparameter?



  • Hallo,

    ich habe eine Klasse Object3D, an die man andere Object3D dran hängen kann. Man kann sie entweder ans gesamte Objekt hängen oder an einen Bone des Objekts.

    Ich bin mir gerade nicht sicher, ob ich eine Funktion mit 2 Parametern und einem Defaultparameter benutzen soll oder doch lieber 2 unterschiedliche Funktionsnamen. Die 2 Möglichkeiten:

    // 1. Mit Defaultparameter:
    class Object3D {
    public:
       void attachChild(Object3D* child, int boneID = -1);
    }
    
    // 2. Mit 2 Methoden:
    class Object3D {
    public:
       void attachChild(Object3D* child);
        void attachChildToBone(Object3D* child, int boneID);
    }
    

    Was findet ihr besser?



  • Musst du bei bone wirklich mit einer ID arbeiten? Man fragt sich woher diese ID kommt, wäre ein Pointer da nicht sinnvoller?



  • cooky451 schrieb:

    Musst du bei bone wirklich mit einer ID arbeiten? Man fragt sich woher diese ID kommt, wäre ein Pointer da nicht sinnvoller?

    Aus technischen Gründen ist die Benutzung von ID sinnvoll. Weiß ich aber noch nicht sicher, ob ich das so lasse. Beantwortet allerdings nicht wirklich meine Frage...



  • Ratfragger schrieb:

    Aus technischen Gründen ist die Benutzung von ID sinnvoll. Weiß ich aber noch nicht sicher, ob ich das so lasse. Beantwortet allerdings nicht wirklich meine Frage...

    Ich weiß, aber ich konnte mich nicht entscheiden. Würde zu Variante 2 tendieren. Einfach nur weil -1 so ein komischer invalider Wert ist.



  • Eher das zweite. Wenns nicht ne Möglichkeit gibt, dem Bone die attach-Methode zu verpassen und einen Getter für den Bone (oder einen Proxy):

    auto& theBone = myObj3d.getBone(theBoneId);
    theBone.attach(theChild);
    


  • Das Problem bei der ersten Variante ist einfach, dass du hier eine magische Konstante benutzt. Was soll -1 als boneId bedeuten? Hat jedes 3D Objekt "bones"? Gibt es ein "default bone" (-1)? Wenn ja, dann würde ich die erste Methode benutzen. Aber anstelle -1 eine Konstante ala default_bone = -1 einführen. Wenn nicht jedes 3D Objekt bones hat, dann würde ich Variante 2 bevorzugen.



  • Normalerweise sind Bones hierarchisch verknüpft. Um sie später performant zu nutzen und weil man sie an Shader übergeben wird, legt man diesen Baum aber in einem vector an. Auch die parentID richtet sich normalerweise nach Position im vector.

    Als Anwender erscheint -1 trotzdem seltsam. Ich würde zu Variante 2 raten oder eine Konstante anlegen:
    const unsigned int ROOT_BONE = -1; z.B. (oder NO_BONE, falls das in dem Kontext auch in Ordnung ist)

    Dann kannst Du in Funktionskopf auch diese angeben und der Benutzer versteht sofort, worum es geht.


Anmelden zum Antworten