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 2.3k 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.
  • Christian EhrlicherC Offline
    Christian EhrlicherC Offline
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on last edited by
    #8

    So my assumption is correct - the pointer is invalid and therefore the app is crashing.

    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
    Visit the Qt Academy at https://academy.qt.io/catalog

    adalovegirlsA 1 Reply Last reply
    0
    • Christian EhrlicherC Christian Ehrlicher

      So my assumption is correct - the pointer is invalid and therefore the app is crashing.

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

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

      kshegunovK 1 Reply Last reply
      0
      • Christian EhrlicherC Offline
        Christian EhrlicherC Offline
        Christian Ehrlicher
        Lifetime Qt Champion
        wrote on last edited by
        #10

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

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

        I don't know your code - make sure to create a proper widget, don't delete it afterwards.

        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
        Visit the Qt Academy at https://academy.qt.io/catalog

        1 Reply Last reply
        0
        • 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