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 19.6k 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ï

    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