Zeiger Problem



  • Hi Leute ich hab n kleines Problem mit nem Zeiger.

    Ich habe Klasse Angelegt mit der Funktion "TestFunktion".
    Dieser Funktion übergebe ich einen Zeiger Auf das Fenster was ich in Main erzeugt habe. App ist das Fenster. nun Möchte ich aber innerhalb der Funktion den Zeiger auf das Fenster an TestFunktion1 weiter geben. Hab Schon Rum Probiert aber bin daran gescheitert.
    Hier ist nochmal das beispiel:

    //Nur eine Beispiel Funktion
    CTest::TestFunktion(sf::RenderWindow *App)
    {
    
     //Würde Funktionieren
     App->Draw(Sprite);
    
    //Hier würde er Mekern
     TestFunktion2(&App);
    
    }
    
    // Diese Funktion hätte ich nun aber gerne in CTest::TestFunktion.
    
    CTest::TestFunktion2(sf::RenderWindow *App)
    {
     App->Draw(Sprite); 
    }
    

    Wenn in TestFuntkion TestFunktion 1 nicht enthalteh ist würde alles Funktionieren.
    Hat jemand ne Idee?



  • Saibot1988 schrieb:

    Hi Leute ich hab n kleines Problem mit nem Zeiger.

    Ich habe Klasse Angelegt mit der Funktion "TestFunktion".
    Dieser Funktion übergebe ich einen Zeiger Auf das Fenster was ich in Main erzeugt habe. App ist das Fenster. nun Möchte ich aber innerhalb der Funktion den Zeiger auf das Fenster an TestFunktion1 weiter geben. Hab Schon Rum Probiert aber bin daran gescheitert.
    Hier ist nochmal das beispiel:

    //Nur eine Beispiel Funktion
    CTest::TestFunktion(sf::RenderWindow *App)
    {
    
     //Würde Funktionieren
     App->Draw(Sprite);
    
    //Hier würde er Mekern
     TestFunktion(&App);
      
    }
    
    // Diese Funktion hätte ich nun aber gerne in CTest::TestFunktion.
    
    CTest::TestFunktion2(sf::RenderWindow *App)
    {
     App->Draw(Sprite); 
    }
    

    Wenn in TestFuntkion TestFunktion 1 nicht enthalteh ist würde alles Funktionieren.
    Hat jemand ne Idee?

    Das kompiliert nicht, da du bereits einen Zeiger erhältst und daher den Adressoperator nicht mehr aufrufen musst. Es handelt sich bereits um eine Adresse:

    TestFunktion(App); // ohne &
    

    Übrigens versucht man in C++ Referenzen zu nutzen 🙂



  • uzjjzuzuj schrieb:

    Saibot1988 schrieb:

    Hi Leute ich hab n kleines Problem mit nem Zeiger.

    Ich habe Klasse Angelegt mit der Funktion "TestFunktion".
    Dieser Funktion übergebe ich einen Zeiger Auf das Fenster was ich in Main erzeugt habe. App ist das Fenster. nun Möchte ich aber innerhalb der Funktion den Zeiger auf das Fenster an TestFunktion1 weiter geben. Hab Schon Rum Probiert aber bin daran gescheitert.
    Hier ist nochmal das beispiel:

    //Nur eine Beispiel Funktion
    CTest::TestFunktion(sf::RenderWindow *App)
    {
    
     //Würde Funktionieren
     App->Draw(Sprite);
    
    //Hier würde er Mekern
     TestFunktion(&App);
      
    }
    
    // Diese Funktion hätte ich nun aber gerne in CTest::TestFunktion.
    
    CTest::TestFunktion2(sf::RenderWindow *App)
    {
     App->Draw(Sprite); 
    }
    

    Wenn in TestFuntkion TestFunktion 1 nicht enthalteh ist würde alles Funktionieren.
    Hat jemand ne Idee?

    Das kompiliert nicht, da du bereits einen Zeiger erhältst und daher den Adressoperator nicht mehr aufrufen musst. Es handelt sich bereits um eine Adresse:

    TestFunktion(App); // ohne &
    

    Übrigens versucht man in C++ Referenzen zu nutzen 🙂

    Übrigens ruft sich deine Funktion selber auf (Rekursion). Du wolltest sicherlich TestFunktion2(App); schreiben.



  • ja genau. habs schon berichtigt. Du meinst ich soll einfach ohne & aufrufen und dann funktionierts? muss ich mal versuchen.



  • Schade es klappt nicht. Er sagt mir error: sf::NonCopyable()::NonCopyable(const sf::NonCopyable&) is Private



  • Zeig doch mal den momentanen Code und an welcher Stelle die Fehlermeldung kommt. Du versuchst wahrscheinlich, nichtkopierbare Objekte zu kopieren.



  • Saibot1988 schrieb:

    Schade es klappt nicht. Er sagt mir error: sf::NonCopyable()::NonCopyable(const sf::NonCopyable&) is Private

    Eventuell tritt der Fehler schon vorher auf. Kannst du deinen Code so gestalten, dass er noch den Fehler enthält, er aber nicht zu lang zum kompletten Posten ist? So könnte man dir besser helfen.



  • #include <iostream>
    #include <SFML/Graphics.hpp>
    
    using namespace std;
    
    class CTest
    {
        public:
        CTest();
        ~CTest();
        void TestFunktion(sf::RenderWindow *App);
        void TestFunktion2(sf::RenderWindow App);
    
    };
    
     CTest::CTest(){}
     CTest::~CTest(){}
    
     void CTest::TestFunktion(sf::RenderWindow *App)
     {
    
         //Tu irgend was
    
        TestFunktion2(App);
    
     }
     void CTest::TestFunktion2(sf::RenderWindow App)
     {
         //TU Was
     }
    
    int main()
    {
        CTest Test;
        sf::RenderWindow App(sf::VideoMode(800,600),"Test");
    
        Test.TestFunktion(&App);
    
        return 0;
    }
    

    So das ist der Code in abgespeckter Form



  • void TestFunktion2(sf::RenderWindow App);
    

    Hier wird der Parameter kopiert, und sf::RenderWindow unterstützt keine Kopiersemantik (aus gutem Grund).



  • und welcher ist das?



  • Saibot1988 schrieb:

    und welcher ist das?

    Meinst du den Grund? Ein sf::RenderWindow repräsentiert ein Fenster, auf das gezeichnet werden kann. Dazu gehören recht viele Ressourcen wie Window-Handles, Renderkontexte, die nicht einfach kopiert werden können. Wieso solltest du ein Fenster kopieren wollen? Wenn du schlichtweg ein neues mit der gleichen Grösse anlegen willst, dann tu das.

    In deinem Fall sind aber Referenzen oder Zeiger die Lösung.



  • aber tu ich das denn nicht?

    angenommen

    funktion(sf::RenderWindow *App)
    {
    
      App->Draw(Sprite);
    }
    

    ich sage ihm doch über den Zeiger das die Zeichenoperation das Fenster App betrifft.
    nun will ich lediglich den Zeiger den ich an funktion gegeben habe an eine unterfunktion weiterreichen.



  • Nexus schrieb:

    void TestFunktion2(sf::RenderWindow App);
    

    Hier wird der Parameter kopiert, und sf::RenderWindow unterstützt keine Kopiersemantik (aus gutem Grund).

    Ist das wirklich so unklar formuliert? Oder wo liegt das Problem?



  • In dem von dir gezeigten Code nimmt die Funktion keinen Zeiger/Referenz. Da müsste ein * sein... (Zeiger)



  • zu deinem Letzten eintrag: es ist mir Klar das es so nicht geht.
    Anders gefragt gäbe es denn eine andere möglichkeit doch über eine Unterfunktion auf die App zuzugrifen? Vieleicht mit den Referenzen? Oder is das auch zum scheitern verurteilt.



  • Wie gesagt mit Zeigern oder mit Referenzen.

    Der Zeiger-Weg:

    void OtherFunc(sf::RenderWindow* App);
    
    void Func(sf::RenderWindow* App)
    {
        OtherFunc(App);
    }
    

    Der Referenz-Weg:

    void OtherFunc(sf::RenderWindow& App);
    
    void Func(sf::RenderWindow& App)
    {
        OtherFunc(App);
    }
    


  • Jetzt klappts auf einmal doch kommisch 😕

    Ich habs auf dem weg versucht wie du es als erstes beschrieben hast. und nun gehts.
    Habe ich der Klasse dann über den ersten aufruf das Fenster App sozusagen bekannt gemacht ja?

    Danke für die Geduld 🙄



  • Saibot1988 schrieb:

    Jetzt klappts auf einmal doch kommisch 😕

    Ich habs auf dem weg versucht wie du es als erstes beschrieben hast. und nun gehts.
    Habe ich der Klasse dann über den ersten aufruf das Fenster App sozusagen bekannt gemacht ja?

    Danke für die Geduld 🙄

    Irgendwie schon, aber sowas wäre natürlich besser:

    class CTest
    {
     private:
      sf::RenderWindow& mApp;
    
     public:
      CTest(sf::RenderWindow& app) : mApp(app) { }
    
      void doSomething()
      {
       mApp.Draw(...);
      }
    };
    


  • Ahhhh ein Kopierkonstruktor 💡

    Davon habe ich schonmal gelesen. Okay ich denke Vergessen werd ich den soleicht nichtmehr
    Danke Leute 👍



  • Saibot1988 schrieb:

    Ahhhh ein Kopierkonstruktor 💡

    Nein, nur ein normaler Konstruktor. 😉

    Ein Kopierkonstruktor würde als einzigen Parameter eine Const-Referenz auf ein Objekt der Klasse nehmen.


Anmelden zum Antworten