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.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 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