Klassen funktion in main nutzen und umgekehrt



  • class Window{
    public:
       void addTriangle(int edge1X, int edge1Y, int edge2X, int edge2Y, int edge3X, int edge3Y){
       ...mache alles damit das Dreieck von Vulkan gerendert werden kann...
       }
       void run(){
          initWindow();
          initVulkan();
          mainLoop();
          cleanup()
       }
       void moveCamX(float amount){
       camX += amount;
       }
       void moveCamY(float amount){
          camY += amount;
       }
       void moveCamZ(float amount){
          camZ += amount;
       }
    private:
       float camX = 0; camY = 0; camZ = 0;
       GLFWwindow window;
       void initWindow(){
       ...GLFW init Stuff...
          glfwSetKeyCallback(window, keyPressed);
       ...
       }
       void initVulkan(){
       ....alles was vulkan so braucht...
        }
       void mainLoop(){
          while (!glfwWindowShouldClose){
                calcFrame();
              ...render Stuff....
          }
       }
       void cleanup(){
       ...alle Vulkan sachen Zerstören...
       }
    };
    
    Window app;
    bool isKeyPressed(int keyCode, int key, int action){
       if(key == keyCode && action == GLFW_PRESS) return true;
       return false;
    }
    void keyPressed(GLFWwindow *window, int key, int keyCode, int action, int mods){
       if(isKeyPressed(GLFW_KEY_KP_8, key, action)) app.moveY(1.0f);
       if(isKeyPressed(GLFW_KEY_KP_5, key, action)) app.moveY(-1.0f);
       if(isKeyPressed(GLFW_KEY_KP_4, key, action)) app.moveX(-1.0f);
       if(isKeyPressed(GLFW_KEY_KP_6, key, action)) app.moveX(1.0f);
    }
    
    void calcFrame(){
       app.addTriangle(100, 50, 50, 100, 200, 200);
    ...all mein späterer code... 
    }
    int main(){
       try{
       app.run();
       } catch(const exception&e ){
          cerr  << e.what() << endl;
          return EXIT_FAILURE;
       }
    }


  • Mein Problem ist einfach nur: Die Funktion glfwSetKeyCallback(window, keyPressed); braucht die definition über der Klasse, sonst sagt der compiler: "keyPressed undeclared identifier" ebenso mit calcFrame(); wenn ich diese Sachen jedoch über die Klasse schiebe, kann ich nicht mehr Window app; schreiben, weil die Klasse Window dort noch nicht vorhanden ist. Dem ensprechend funktioniert dann auch die funktion keyPressed nicht mehr, weil diese ja dinge wie app.moveY(1.0f) enthält.

    PS: mir is gerade aufgefallen, dass der Titel nicht wirklich zu meinem Problem passt, ich hoff das ist nicht so schlimm


  • Mod

    Was du brauchst, ist einfach nur eine Forward-Deklaration. Außerdem zwingt dich doch niemand die Funktionsdefinitionen direkt in die Klasse zu schreiben (und wahrscheinlich solltest du es auch nicht…), d.h. alternativ kannst du Window::intiWindow auch ganz woanders definieren, wo die Sachen alle bekannt sind, die du nutzen möchtest.



  • kannst du bitte nen Beispiel machen, ich verstehe nicht ganz was du meinst :' )


  • Mod

    Forward-Deklaration:

    int foo();  // Kann man einfach so im Programm deklarieren, so oft man will. Nuyn weiß der Compiler, es gibt ein foo(), das int liefert. Das reicht.
    
    void bar()
    {
    	std::cout << foo();  // Wir können foo benutzen, obwohl es noch nicht definiert ist
    }
    
    int foo()  // Foo definieren wir einfach irgendwo ganz woanders
    {
    	return 42;
    }
    

    Das ist ungeheuer wichtig, das zu kennen, denn das ist, wie Header funktionieren! Guck dir das genauer an!

    Klassenmember einfach irgendwo anders definieren:

    class Foo
    {
    public:
    	void bar();   // Können wir auch einfach so deklarieren, ohne genaue Definition
    };
    
    
    int foo()
    {
    	return 42;
    }
    
    
    void Foo::bar()
    {
    	std::cout << foo();   // Wir konnen foo nutzen, obwohl es noch nicht bekannt war bei der ersten Deklaration von Foo::bar
    }
    

    Auch dies ist ungeheuer wichtig, weil man so den Code der Klasse von der Klassendefinition loslösen kann, was dann auch Anwendung für Header hat!

    Da fehlen dir aber wichtigste Grundlagen. Das wird ja sicher nicht das einzige sein, was du verpasst hast. Bevor du anderer Leute Frameworks benutzt, noch dazu C-Frameworks, musst du die Sprache an sich besser lernen! Hier brauchst du sogar zwei Sprachen in denen du Fit sein musst. Du musst erst einmal ein paar eigene Programme in C++ (und hier auch C) geschrieben haben, bevor du ein so kompliziertes Framework benutzen kannst.



  • ahhh danke jetzt check ich das



  • aber ich muss dann doch auch die Parameter schon in die Funktion schreiben?

    //das hier ist falsch?
    void doSomething();
    
    int counter = 0;
    void doSomething(int x){
       counter +=1;
    }
    
    //das hier ist richtig?
    
    void doSomething(int x);
    
    int counter = 0;
    void doSomething(int x){
       counter += 1;
    }
    

  • Mod

    Ja, du musst das zweite schreiben. Guck dir dieses und andere Themen unbedingt in einem Lehrbuch an! So ein kleiner Forenbeitrag kann das nicht ausreichend erklären.



  • @SeppJ kannst du mir ein gutes nennen? ich kenne keins und aus den 200 in der Liste ist das dann doch schwer das richtige zu finden


  • Mod

    200? Da sind zwei die in der Kategorie für Anfänger angeführt sind. Und vielleicht 20 insgesamt. Bitte lies Texte genau und denk über sie nach!



  • @SeppJ ich bin jetzt mal auf cplusplus.com gegangen, das ist auch prima danke, aber du solltest mal die restlichen links überprüfen und neu anlegen, ein paar sind garnicht mehr erreichbar.


Anmelden zum Antworten