Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Unable to add items when function called from other class?
Forum Updated to NodeBB v4.3 + New Features

Unable to add items when function called from other class?

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 3 Posters 1.8k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • adalovegirlsA adalovegirls

    @Christian-Ehrlicher How can I make it valid when I need it, then?

    kshegunovK Offline
    kshegunovK Offline
    kshegunov
    Moderators
    wrote on last edited by
    #11

    @adalovegirls said in Unable to add items when function called from other class?:

    How can I make it valid when I need it, then?

    Out of curiosity, is there a reason that everybody and their mother is a global variable?
    Anyway, I peeked, and you're almost certainly calling updateWidgets() when there's no Debugger object created.
    Piece of advice - fix this code pronto. Globals are nasty, everything global is everything nasty ... you get the idea ...

    Read and abide by the Qt Code of Conduct

    adalovegirlsA 1 Reply Last reply
    2
    • kshegunovK kshegunov

      @adalovegirls said in Unable to add items when function called from other class?:

      How can I make it valid when I need it, then?

      Out of curiosity, is there a reason that everybody and their mother is a global variable?
      Anyway, I peeked, and you're almost certainly calling updateWidgets() when there's no Debugger object created.
      Piece of advice - fix this code pronto. Globals are nasty, everything global is everything nasty ... you get the idea ...

      adalovegirlsA Offline
      adalovegirlsA Offline
      adalovegirls
      wrote on last edited by
      #12

      @kshegunov No reason! I'm just a beginner who doesn't really know what they're doing. :)
      And yes, I am aware now that I was calling updateWidgets() when Debugger had yet to be created, I'm asking how I can solve this in a more elegant way than calling it every mainLoop iteration:

      void SDL2Widget::mainLoop() {
          debug = Debugger::getDebugContext();
      
          if (debug)
              debug->updateWidgets();
      }
      

      It works, but I'm sure it's not the best way to do it.

      kshegunovK 1 Reply Last reply
      0
      • adalovegirlsA adalovegirls

        @kshegunov No reason! I'm just a beginner who doesn't really know what they're doing. :)
        And yes, I am aware now that I was calling updateWidgets() when Debugger had yet to be created, I'm asking how I can solve this in a more elegant way than calling it every mainLoop iteration:

        void SDL2Widget::mainLoop() {
            debug = Debugger::getDebugContext();
        
            if (debug)
                debug->updateWidgets();
        }
        

        It works, but I'm sure it's not the best way to do it.

        kshegunovK Offline
        kshegunovK Offline
        kshegunov
        Moderators
        wrote on last edited by kshegunov
        #13

        @adalovegirls said in Unable to add items when function called from other class?:

        And yes, I am aware now that I was calling updateWidgets() when Debugger had yet to be created, I'm asking how I can solve this in a more elegant way than calling it every mainLoop iteration:

        If you keep the Debugger as a pseudo-singleton (i.e. a glorified global), this is exactly how you do it.
        Alternatively, you can enforce that a debugger is created before whatever widget by passing its address through the widget's constructor (and saving it in a member variable). Then you can't create a widget without first having a debugger and you don't get/check anything in the loop. If you're in the loop then Debugger has been passed to you/exists already.

        Read and abide by the Qt Code of Conduct

        adalovegirlsA 1 Reply Last reply
        0
        • kshegunovK kshegunov

          @adalovegirls said in Unable to add items when function called from other class?:

          And yes, I am aware now that I was calling updateWidgets() when Debugger had yet to be created, I'm asking how I can solve this in a more elegant way than calling it every mainLoop iteration:

          If you keep the Debugger as a pseudo-singleton (i.e. a glorified global), this is exactly how you do it.
          Alternatively, you can enforce that a debugger is created before whatever widget by passing its address through the widget's constructor (and saving it in a member variable). Then you can't create a widget without first having a debugger and you don't get/check anything in the loop. If you're in the loop then Debugger has been passed to you/exists already.

          adalovegirlsA Offline
          adalovegirlsA Offline
          adalovegirls
          wrote on last edited by
          #14

          @kshegunov Alright. I guess I'll stick with the current method then, because I don't want it to be a requirement that the debugger is created before the emulator runs.

          kshegunovK 1 Reply Last reply
          0
          • adalovegirlsA adalovegirls

            @kshegunov Alright. I guess I'll stick with the current method then, because I don't want it to be a requirement that the debugger is created before the emulator runs.

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by
            #15

            @adalovegirls said in Unable to add items when function called from other class?:

            Alright. I guess I'll stick with the current method then, because I don't want it to be a requirement that the debugger is created before the emulator runs.

            Then I suggest you put the pointer into the class and set it to the widget through a setter, instead of coupling the classes through the Debugger::getDebugContext or pass it through the constructor, but with a default value (of nullptr). As a rule of thumb you want to rely on as few application-global states (a.k.a. global variables) as possible.

            Read and abide by the Qt Code of Conduct

            adalovegirlsA 1 Reply Last reply
            1
            • kshegunovK kshegunov

              @adalovegirls said in Unable to add items when function called from other class?:

              Alright. I guess I'll stick with the current method then, because I don't want it to be a requirement that the debugger is created before the emulator runs.

              Then I suggest you put the pointer into the class and set it to the widget through a setter, instead of coupling the classes through the Debugger::getDebugContext or pass it through the constructor, but with a default value (of nullptr). As a rule of thumb you want to rely on as few application-global states (a.k.a. global variables) as possible.

              adalovegirlsA Offline
              adalovegirlsA Offline
              adalovegirls
              wrote on last edited by
              #16

              @kshegunov I don't know how to do that without an example...

              kshegunovK 1 Reply Last reply
              0
              • adalovegirlsA adalovegirls

                @kshegunov I don't know how to do that without an example...

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by kshegunov
                #17

                https://www.geeksforgeeks.org/constructors-c/
                also
                https://www.w3schools.com/cpp/cpp_encapsulation.asp

                Read and abide by the Qt Code of Conduct

                adalovegirlsA 2 Replies Last reply
                0
                • kshegunovK kshegunov

                  https://www.geeksforgeeks.org/constructors-c/
                  also
                  https://www.w3schools.com/cpp/cpp_encapsulation.asp

                  adalovegirlsA Offline
                  adalovegirlsA Offline
                  adalovegirls
                  wrote on last edited by
                  #18
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • kshegunovK kshegunov

                    https://www.geeksforgeeks.org/constructors-c/
                    also
                    https://www.w3schools.com/cpp/cpp_encapsulation.asp

                    adalovegirlsA Offline
                    adalovegirlsA Offline
                    adalovegirls
                    wrote on last edited by
                    #19

                    @kshegunov Alright. I tried making a setter function in SDL2Widget, but in the header for it I'm getting the error Debugger has not been declared even though I have debugger.h included:

                    SDL2Widget.h

                    #ifndef SDL2WIDGET_H
                    #define SDL2WIDGET_H
                    
                    #include "chip8.h"
                    #include "SDL.h"
                    #include "debugger.h"
                    
                    #include <QDebug>
                    #include <QWidget>
                    #include <QTimer>
                    #include <vector>
                    
                    class SDL2Widget : public QWidget
                    {
                    	Q_OBJECT    
                    public:
                        SDL2Widget(QWidget* parent = nullptr);
                    	~SDL2Widget();
                        static void loadRom(std::vector<unsigned char> rom);
                        static void recKey(int key, bool state);
                        static Chip8* getC8Context();
                        static SDL2Widget* getSDLContext();
                        void setDebugContext(Debugger* dbg);
                    };
                    #endif
                    

                    SDL2Widget.cpp

                    void SDL2Widget::setDebugContext(Debugger* dbg) {
                        debug = dbg;
                    }
                    

                    I'm also getting the error no matching function for call to SDL2Widget::setDebugContext(Debugger*) when calling the setter from the Debugger class:

                    debugger.cpp

                    sdl2->setDebugContext(this);
                    
                    kshegunovK 1 Reply Last reply
                    0
                    • adalovegirlsA adalovegirls

                      @kshegunov Alright. I tried making a setter function in SDL2Widget, but in the header for it I'm getting the error Debugger has not been declared even though I have debugger.h included:

                      SDL2Widget.h

                      #ifndef SDL2WIDGET_H
                      #define SDL2WIDGET_H
                      
                      #include "chip8.h"
                      #include "SDL.h"
                      #include "debugger.h"
                      
                      #include <QDebug>
                      #include <QWidget>
                      #include <QTimer>
                      #include <vector>
                      
                      class SDL2Widget : public QWidget
                      {
                      	Q_OBJECT    
                      public:
                          SDL2Widget(QWidget* parent = nullptr);
                      	~SDL2Widget();
                          static void loadRom(std::vector<unsigned char> rom);
                          static void recKey(int key, bool state);
                          static Chip8* getC8Context();
                          static SDL2Widget* getSDLContext();
                          void setDebugContext(Debugger* dbg);
                      };
                      #endif
                      

                      SDL2Widget.cpp

                      void SDL2Widget::setDebugContext(Debugger* dbg) {
                          debug = dbg;
                      }
                      

                      I'm also getting the error no matching function for call to SDL2Widget::setDebugContext(Debugger*) when calling the setter from the Debugger class:

                      debugger.cpp

                      sdl2->setDebugContext(this);
                      
                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by
                      #20

                      You probably have a cyclic dependency. Forward declare the class(es) and include the headers in the source files only is the solution.

                      Read and abide by the Qt Code of Conduct

                      1 Reply Last reply
                      2

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved