Methode einer Klasse in einer Methode derselben Klasse ausführen (oder funktion kp)



  • Hallo
    ich habe ein kleines grundlegendes Problem.
    erstmal der codeausschnitt

    //Klasse: Entity
    Entity::Entity()
    {
         setEnv(Startup start); //weiß nicht was für ein argument ich hier                 
                                //reinschreiben soll
    }
    
    void Entity::setEnv(Startup start)
    {
         //Stellt diese ganze Umgebung ein
         device = start.device;
         driver = start.driver; 
         smgr   = start.smgr; 
         guienv = start.guienv;
    }
    

    So ich habe 2 klassen einmal die Klasse startub. Die hat diese devices... schon initialisiert und deshalb möchte ich sie übernehmen. Schön und gut. Nur möchte ich, dass dies gleich beim Konstruktor passiert und deshalb schreibe ich die setEnv methode in den Konstruktor. Aber der Compiler sagt: "Nein das geth so nicht". Und auch ich bezweifle dies. Also wie stelle ich das an?



  • Hallo

    du must an setEnv ein gültiges Objekt vom Typ Startup übergeben.
    du kannst das zum Beispiel über den Konstruktor bekommen.
    Je nachdem was Startupo denn eigentlich ist und wo es herkommen soll.

    ...
    // Definition
    Entity(Startup start = Startup());
    ...
    
    // Implementation
    Entity::Entity(Startup start)
    {
         setEnv(start); 
    }
    

    bis bald
    akari



  • Ich danke herzlich für deine Hilfe,
    jetzt wo ich es sehe schäme ich mich, dass ich es selber nciht geschafft habe.



  • dennoch habe ich eine weitere nicht wirklich "wichtige" Frage:
    Ich weiß nicht ob ich es schaffe mich ordentlich auszudrücken,

    Ich habe eine Basisklasse. Diese Klasse hat eine Methode setPosition(). In ihr wird wird die Klasseneigene ISceneNode* node positioniert.
    Ich habe eine vererbte Klasse. Diese Klasse benutzt aber nicht das ISceneNode* node, sonder das ISceneCameraNode* node.
    Wenn ich ein Objekt erstelle CamEntity (abgeleitete Klasse) camera();
    und nun setPosition benutze camera.setPosition(33,33,33);

    Dann sagt der Compiler nichts, aber das Programm gibt einen Fehler.
    Wenn ich nun eine setPosition Methode in der Klasse CamEntity schreibe (die im Prinzip genauso aufgebaut ist), dann funktioniert es einwandfrei.

    Mein Verdacht ist also, dass (gemäß dem ersten Fall) die falsche node benutzt wird, nämlich die aus der Basisklasse.
    Meine Frage ist nun: Kann ich auf einfache Weise in der abgeleiteten Klasse angeben, dass nicht das node der Basisklasse, sondern das node der eigenen Klasse für die Methode setPosition benutzt werden soll ohne eine neue Methode zu schreiben (denn sonst ist die Basisklasse doch recht unnütz)?

    Ferner würde ich gerne wissen wieso die Basisklasse einen Konstruktor ohne Argumente braucht, damit Objekte aud abgeleiteten Klassen gemacht werden können. Und wieso reicht es nicht aus einen Prototyp dieses Konstruktors zu schreiben, sondern extra

    Entity::Entity()
    {
    ;
    }
    

    (Andernfalls gibt mir der Compiler eine Fehlermeldung)



  • Es sollte das Einfachste sein die Funktion der Basisklasse zu überschreiben, die Alternative wäre ihr den Pointer den sie nutzen soll als Argument zu übergeben.

    wieso die Basisklasse einen Konstruktor ohne Argumente braucht

    Wenn du in der abgeleiteten Klasse keinen Konstruktor hast dann stellt der Kompiler einen, welcher einen Standartkonstruktor der Basisklasse aufrufen will (ohne Argument). Wenn du in einer Klasse einen Kostruktor schreibst, auch wenn der Argumente hat, dann gibt der Kompiler der Klasse scheinbar keinen Standertkonstruktor mehr, warum auch immer. Wär vllt eine Idee für C++0x.

    wieso reicht es nicht aus einen Prototyp dieses Konstruktors zu schreiben

    Wenn du nen Prototyp hast muss auch ne Funktion sonst muss es ja zu einem Fehler kommen, wenn die Funktion aufgerufen werden soll.

    mfg
    Apophis



  • Lord Apophis schrieb:

    Wenn du in einer Klasse einen Kostruktor schreibst, auch wenn der Argumente hat, dann gibt der Kompiler der Klasse scheinbar keinen Standertkonstruktor mehr, warum auch immer. Wär vllt eine Idee für C++0x.

    Um Himmels willen, bloss nicht. Schonmal daran gedacht dass man Standardkonstruktion mit voller Absicht verbieten können möchte?



  • LordJaxom schrieb:

    Um Himmels willen, bloss nicht. Schonmal daran gedacht dass man Standardkonstruktion mit voller Absicht verbieten können möchte?

    Ja, das wäre dann die anderes Seite der Medallie, man könnte vergessen einen zu schreiben, wenn man einen brauch. Hat alles Vor- und Nachteile, muss man halt abwiegen...

    Aber wenn ich es mir genauer überlege, dürften wirklich die Nachteile die Vorteile überwiegen, hast recht.

    mfg



  • Lord Apophis schrieb:

    LordJaxom schrieb:

    Um Himmels willen, bloss nicht. Schonmal daran gedacht dass man Standardkonstruktion mit voller Absicht verbieten können möchte?

    Ja, das wäre dann die anderes Seite der Medallie, man könnte vergessen einen zu schreiben, wenn man einen brauch. Hat alles Vor- und Nachteile, muss man halt abwiegen...

    Wieso ist das ein Nachteil? Wenn du den Default-Ctor versehentlich vergisst, macht dich der Compiler drauf aufmerksam. Wenn du vergessen würdest, ihn unbrauchbar zu machen, bemerkt das niemand für dich (das crasht bestenfalls zur Laufzeit, weil irgendein Wert vom Default-Ctor falsch belegt wurde).

    Edit @Dr.Octopus: Auch für Basisklassen brauchst du nicht unbedingt einen Default-Ctor. Da mußt du halt in der Initialisierungsliste der abgeleiteten Klasse angeben, welcher Basis-Ctor mit welchen Parametern aufgerufen werden soll:

    class Base
    {
    public:
      Base(const string&)
      {...}
    };
    
    class Derived : public Base
    {
    public:
      Derived(int v1,int v2) : Base("Derived Class")
      {...}
    };
    

Log in to reply