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. generalize a c++ method
Qt 6.11 is out! See what's new in the release blog

generalize a c++ method

Scheduled Pinned Locked Moved Solved General and Desktop
34 Posts 5 Posters 8.7k 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.
  • ODБOïO ODБOï

    @jsulm said in generalize a c++ method:

    this->updateHandlerPtr();

    yes i did also, in that case error is :

    no member named 'updateHandlerPtr' in 'MachineBackend '
    which is true

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #20

    @LeLev This should compile:

    (this->*updateHandlerPtr)();
    

    Method pointers are a mess :-)

    1 Reply Last reply
    2
    • ODБOïO Offline
      ODБOïO Offline
      ODБOï
      wrote on last edited by
      #21

      yes now it doas. awesome ! thank you so much!

      class MachineBackend : public QObject
      {
          typedef void (MachineBackend::*MethodPtr) ();
          Q_OBJECT
      
      void nIndexUpdated(QOpcUa::NodeAttribute attr, const QVariant &value){...}
      
      void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
             
             (this->*updateHandlerPtr)();
      
          }
      };
      
      
      
      

      there is still an issue in the usSub() call

      //  Somewhere inside class
        uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::nIndexUpdated);  // << error
      //
      

      error : reference to non-static member function must be called

      im trying every possible syntax right now ...

      jsulmJ 2 Replies Last reply
      0
      • ODБOïO ODБOï

        yes now it doas. awesome ! thank you so much!

        class MachineBackend : public QObject
        {
            typedef void (MachineBackend::*MethodPtr) ();
            Q_OBJECT
        
        void nIndexUpdated(QOpcUa::NodeAttribute attr, const QVariant &value){...}
        
        void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
               
               (this->*updateHandlerPtr)();
        
            }
        };
        
        
        
        

        there is still an issue in the usSub() call

        //  Somewhere inside class
          uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::nIndexUpdated);  // << error
        //
        

        error : reference to non-static member function must be called

        im trying every possible syntax right now ...

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #22

        @LeLev said in generalize a c++ method:

        uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::nIndexUpdated);

        uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", &MachineBackend::nIndexUpdated);
        
        ODБOïO 1 Reply Last reply
        1
        • ODБOïO ODБOï

          yes now it doas. awesome ! thank you so much!

          class MachineBackend : public QObject
          {
              typedef void (MachineBackend::*MethodPtr) ();
              Q_OBJECT
          
          void nIndexUpdated(QOpcUa::NodeAttribute attr, const QVariant &value){...}
          
          void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
                 
                 (this->*updateHandlerPtr)();
          
              }
          };
          
          
          
          

          there is still an issue in the usSub() call

          //  Somewhere inside class
            uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::nIndexUpdated);  // << error
          //
          

          error : reference to non-static member function must be called

          im trying every possible syntax right now ...

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #23

          @LeLev This small example works for me:

          #include <iostream>
          
          class A
          {
          public:
              typedef void (A::*MethodPtr) ();
              void someMethod() { std::cout << "Hallo!" << std::endl; }
              void uaSub2(MethodPtr updateHandlerPtr){
                 (this->* updateHandlerPtr)();
              }
          };
          
          int main()
          {
              A a;
              a.uaSub2(&A::someMethod); 
              return 0;
          }
          
          1 Reply Last reply
          1
          • jsulmJ jsulm

            @LeLev said in generalize a c++ method:

            uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::nIndexUpdated);

            uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", &MachineBackend::nIndexUpdated);
            
            ODБOïO Offline
            ODБOïO Offline
            ODБOï
            wrote on last edited by
            #24

            @jsulm yes sorry that is the first one i have tryed:

            uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", &MachineBackend::nIndexUpdated);
            
            // err :  cannot initialize a parameter of type 'Machinebackend::MethorPtr' (aka 'void (MAchinebackend::*)()') with an rvalue of type 'void (MAchineBAckend::*)(QOpcUa::NodeAttribute, const QVariant &)' : different number of parameters (0 vs 2)
            
            error : no matching function for call to 'MachineBackend::uaSub2(QScopedPointer<QOpcUaNode>&, const char [19], <unresolved overloaded function type>)'
                     uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex",MachineBackend::nIndexUpdated);
                                                                                         ^
            
            jsulmJ 2 Replies Last reply
            0
            • ODБOïO ODБOï

              @jsulm yes sorry that is the first one i have tryed:

              uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", &MachineBackend::nIndexUpdated);
              
              // err :  cannot initialize a parameter of type 'Machinebackend::MethorPtr' (aka 'void (MAchinebackend::*)()') with an rvalue of type 'void (MAchineBAckend::*)(QOpcUa::NodeAttribute, const QVariant &)' : different number of parameters (0 vs 2)
              
              error : no matching function for call to 'MachineBackend::uaSub2(QScopedPointer<QOpcUaNode>&, const char [19], <unresolved overloaded function type>)'
                       uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex",MachineBackend::nIndexUpdated);
                                                                                           ^
              
              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #25
              This post is deleted!
              ODБOïO 1 Reply Last reply
              0
              • ODБOïO ODБOï

                @jsulm yes sorry that is the first one i have tryed:

                uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex", &MachineBackend::nIndexUpdated);
                
                // err :  cannot initialize a parameter of type 'Machinebackend::MethorPtr' (aka 'void (MAchinebackend::*)()') with an rvalue of type 'void (MAchineBAckend::*)(QOpcUa::NodeAttribute, const QVariant &)' : different number of parameters (0 vs 2)
                
                error : no matching function for call to 'MachineBackend::uaSub2(QScopedPointer<QOpcUaNode>&, const char [19], <unresolved overloaded function type>)'
                         uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex",MachineBackend::nIndexUpdated);
                                                                                             ^
                
                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by jsulm
                #26

                @LeLev said in generalize a c++ method:

                nIndexUpdated

                This one has parameters, you need to adapt your typedef for the pointer accordingly.
                This is what the error tells you.

                1 Reply Last reply
                1
                • jsulmJ jsulm

                  This post is deleted!

                  ODБOïO Offline
                  ODБOïO Offline
                  ODБOï
                  wrote on last edited by
                  #27

                  @jsulm

                  class MachineBackend : public QObject
                  {
                      typedef void (MachineBackend::*MethodPtr) ();
                      Q_OBJECT
                  
                  void nIndexUpdated(QOpcUa::NodeAttribute attr, const QVariant &value){...}
                  
                  void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
                         
                         (this->*updateHandlerPtr)();
                  
                      }
                  };
                  

                  in the constructor of this class i call m_client.connectToServer(), then connect stateChanged signal of the m_client to a method where i want to create the subscriptions :

                   QObject::connect(m_client.data(), &QOpcUaClient::stateChanged, this, &MachineBackend::clientStateHandler);
                  
                  void MachineBackend::clientStateHandler(QOpcUaClient::ClientState state)
                  {
                      setConnected((state == QOpcUaClient::ClientState::Connected)); 
                  
                      if (state == QOpcUaClient::ClientState::Connected) {// if client is connected i create subscriptions
                                   
                          // uaSub(nIndexNode,"ns=4;s=MAIN.nIndex",*nIndexUpdated); // function pointer to static function
                  
                          // uaSub1(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::NINDEX) // enum
                          
                           uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex",&MachineBackend::nIndexUpdated);   
                  
                      }
                  
                     [...]
                  }
                  
                  

                  I think i have to adapt my typedef because &QOpcUaClient::stateChanged returns 2 parameters

                  jsulmJ 1 Reply Last reply
                  0
                  • ODБOïO ODБOï

                    @jsulm

                    class MachineBackend : public QObject
                    {
                        typedef void (MachineBackend::*MethodPtr) ();
                        Q_OBJECT
                    
                    void nIndexUpdated(QOpcUa::NodeAttribute attr, const QVariant &value){...}
                    
                    void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
                           
                           (this->*updateHandlerPtr)();
                    
                        }
                    };
                    

                    in the constructor of this class i call m_client.connectToServer(), then connect stateChanged signal of the m_client to a method where i want to create the subscriptions :

                     QObject::connect(m_client.data(), &QOpcUaClient::stateChanged, this, &MachineBackend::clientStateHandler);
                    
                    void MachineBackend::clientStateHandler(QOpcUaClient::ClientState state)
                    {
                        setConnected((state == QOpcUaClient::ClientState::Connected)); 
                    
                        if (state == QOpcUaClient::ClientState::Connected) {// if client is connected i create subscriptions
                                     
                            // uaSub(nIndexNode,"ns=4;s=MAIN.nIndex",*nIndexUpdated); // function pointer to static function
                    
                            // uaSub1(nIndexNode,"ns=4;s=MAIN.nIndex", MachineBackend::NINDEX) // enum
                            
                             uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex",&MachineBackend::nIndexUpdated);   
                    
                        }
                    
                       [...]
                    }
                    
                    

                    I think i have to adapt my typedef because &QOpcUaClient::stateChanged returns 2 parameters

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by jsulm
                    #28

                    @LeLev said in generalize a c++ method:

                    I think i have to adapt my typedef

                    Yes, you have to specify the parameter types when defining a function/method pointer type.

                    1 Reply Last reply
                    3
                    • ODБOïO Offline
                      ODБOïO Offline
                      ODБOï
                      wrote on last edited by
                      #29

                      i'm having troubles to adapt the typedef..
                      should it be

                      typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute attr,const QVariant &value);
                      
                       or 
                      
                      typedef void (MachineBackend::*MethodPtr(QOpcUa::NodeAttribute attr,const QVariant &value)) ();
                      
                      jsulmJ 1 Reply Last reply
                      0
                      • ODБOïO ODБOï

                        i'm having troubles to adapt the typedef..
                        should it be

                        typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute attr,const QVariant &value);
                        
                         or 
                        
                        typedef void (MachineBackend::*MethodPtr(QOpcUa::NodeAttribute attr,const QVariant &value)) ();
                        
                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #30

                        @LeLev said in generalize a c++ method:

                        typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute attr,const QVariant &value);

                        typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute, const QVariant&);
                        

                        No need for parameter names, only types.

                        ODБOïO 1 Reply Last reply
                        3
                        • jsulmJ jsulm

                          @LeLev said in generalize a c++ method:

                          typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute attr,const QVariant &value);

                          typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute, const QVariant&);
                          

                          No need for parameter names, only types.

                          ODБOïO Offline
                          ODБOïO Offline
                          ODБOï
                          wrote on last edited by ODБOï
                          #31

                          @jsulm

                          class MachineBackend : public QObject
                          {
                              typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute, const QVariant&);
                          
                              Q_OBJECT
                          
                          public:
                              void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
                           
                                //  trying to use lambda to call my pointed function but can't
                          
                                /*  QObject::connect(node.data(),&QOpcUaNode::attributeUpdated,[&]{
                                       (this->*updateHandlerPtr() ) ();
                                  });
                               */ 
                            
                                   // maybe  is it possible to connect to my function directly  ?     
                               QObject::connect(node.data(),&QOpcUaNode::attributeUpdated,this,&MachineBackend:: ??)
                          
                              }
                              
                          
                          };
                          
                          jsulmJ 1 Reply Last reply
                          0
                          • ODБOïO ODБOï

                            @jsulm

                            class MachineBackend : public QObject
                            {
                                typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute, const QVariant&);
                            
                                Q_OBJECT
                            
                            public:
                                void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
                             
                                  //  trying to use lambda to call my pointed function but can't
                            
                                  /*  QObject::connect(node.data(),&QOpcUaNode::attributeUpdated,[&]{
                                         (this->*updateHandlerPtr() ) ();
                                    });
                                 */ 
                              
                                     // maybe  is it possible to connect to my function directly  ?     
                                 QObject::connect(node.data(),&QOpcUaNode::attributeUpdated,this,&MachineBackend:: ??)
                            
                                }
                                
                            
                            };
                            
                            jsulmJ Offline
                            jsulmJ Offline
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #32

                            @LeLev said in generalize a c++ method:

                            (this->*updateHandlerPtr() ) ();

                            (this->*updateHandlerPtr) (); <--- You have to pass 2 parameters to it!
                            
                            ODБOïO 1 Reply Last reply
                            3
                            • jsulmJ jsulm

                              @LeLev said in generalize a c++ method:

                              (this->*updateHandlerPtr() ) ();

                              (this->*updateHandlerPtr) (); <--- You have to pass 2 parameters to it!
                              
                              ODБOïO Offline
                              ODБOïO Offline
                              ODБOï
                              wrote on last edited by ODБOï
                              #33

                              @jsulm yes but i don't have any parameter to pass to it .. .

                              its just a handler function that must be connected to
                              QOpcUaNode::attributeUpdated witch returns 2 values ;

                              that is why it has to have 2 params.

                              I don't want to call that function, i want it to be connected to

                              QOpcUaNode::attributeUpdated , and called automatically when attributeUpdated is emitted in the opcua backend

                              1 Reply Last reply
                              0
                              • ODБOïO Offline
                                ODБOïO Offline
                                ODБOï
                                wrote on last edited by ODБOï
                                #34

                                @jsulm finally it is this working thanks to you !

                                class MachineBackend : public QObject
                                {
                                    typedef void (MachineBackend::*MethodPtr) (QOpcUa::NodeAttribute, const QVariant&);
                                
                                    Q_OBJECT
                                
                                
                                public:
                                
                                
                                    void uaSub2(QScopedPointer<QOpcUaNode>&node, QString nodeId, MethodPtr updateHandlerPtr){
                                
                                     QObject::connect(node.data(),&QOpcUaNode::attributeUpdated,this,updateHandlerPtr);
                                
                                    }
                                
                                  void nIndexUpdated(QOpcUa::NodeAttribute attr, const QVariant &value){
                                        //return; // i can access member variables / signal / methods here
                                    }
                                
                                
                                // use uaSub
                                
                                uaSub2(nIndexNode,"ns=4;s=MAIN.nIndex",&MachineBackend::nIndexUpdated);
                                //
                                
                                };
                                

                                thank you infinitely everybody who helped me

                                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