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 12.2k 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 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