Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. How to return myclass reference?
Forum Updated to NodeBB v4.3 + New Features

How to return myclass reference?

Scheduled Pinned Locked Moved Solved C++ Gurus
18 Posts 7 Posters 6.2k Views 4 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.
  • Taz742T Offline
    Taz742T Offline
    Taz742
    wrote on last edited by Taz742
    #1

    i trying this, but i have issues 'reference to local variable temp returned'. I know this question not about Qt.

    Contact& GlobalAll::getContactByUID(const int &UID) {
        int low = 0, high = this->allContacts.size() - 1;
    
        while (low <= high) {
            int middle = (low + high) >> 1;
    
            if (this->allContacts[middle].UID == UID) {
                Contact &now = this->AllContacts[middle];
                return now;
            }
    
            if (this->allContacts[middle].UID < UID) {
                low = middle + 1;
            } else {
                high = middle - 1;
            }
        }
    
        Contact temp;
    
        return temp;
    }
    

    Do what you want.

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #2

      Hi!

      Contact& GlobalAll::getContactByUID(...) { // returns a reference to a Contact object
         // ...
          Contact temp; // local object that lives on the stack
          return temp; // takes address of the local object and returns it
      } // temp goes out of scope and gets destroyed, thus the reference points to invalid memory
      
      Taz742T 1 Reply Last reply
      4
      • ? A Former User

        Hi!

        Contact& GlobalAll::getContactByUID(...) { // returns a reference to a Contact object
           // ...
            Contact temp; // local object that lives on the stack
            return temp; // takes address of the local object and returns it
        } // temp goes out of scope and gets destroyed, thus the reference points to invalid memory
        
        Taz742T Offline
        Taz742T Offline
        Taz742
        wrote on last edited by
        #3

        @Wieland Yes I know a little about it.
        When I call this function, it does not come to temp, that means the object will always come back. I just want this issue disappear.

        Do what you want.

        1 Reply Last reply
        0
        • JohanSoloJ Offline
          JohanSoloJ Offline
          JohanSolo
          wrote on last edited by JohanSolo
          #4

          You can't: to return a reference the returned object must exist outside the function scope. To "solve" the issue you must either change the signature to Contact GloballAll::getContactByUID() or to something like bool GloballAll::getContactByUID( ..., Contact& return )

          `They did not know it was impossible, so they did it.'
          -- Mark Twain

          Taz742T K 2 Replies Last reply
          1
          • JohanSoloJ JohanSolo

            You can't: to return a reference the returned object must exist outside the function scope. To "solve" the issue you must either change the signature to Contact GloballAll::getContactByUID() or to something like bool GloballAll::getContactByUID( ..., Contact& return )

            Taz742T Offline
            Taz742T Offline
            Taz742
            wrote on last edited by
            #5

            @JohanSolo thank for the answer. solved.

            Do what you want.

            1 Reply Last reply
            0
            • kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by
              #6

              Just FYI, there's a rather obscure and bad (in my opinion) feature of the language concerning returning references to local objects. You are allowed to return const references to local objects causing the lifetime of the the object to be extended beyond the usual one, and to be bound to the life time of the const reference itself.

              Here's a longer discussion about it:
              https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

              Read and abide by the Qt Code of Conduct

              1 Reply Last reply
              3
              • VRoninV Offline
                VRoninV Offline
                VRonin
                wrote on last edited by
                #7

                My suggestion: return a pointer instead of a reference:

                Contact* GlobalAll::getContactByUID(const int &UID) {
                    int low = 0, high = this->allContacts.size() - 1;
                
                    while (low <= high) {
                        int middle = (low + high) >> 1;
                
                        if (this->allContacts[middle].UID == UID) {
                            return &(this->AllContacts[middle]);
                        }
                
                        if (this->allContacts[middle].UID < UID) {
                            low = middle + 1;
                        } else {
                            high = middle - 1;
                        }
                    }
                    return nullptr;
                }
                

                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                ~Napoleon Bonaparte

                On a crusade to banish setIndexWidget() from the holy land of Qt

                ? 1 Reply Last reply
                3
                • VRoninV VRonin

                  My suggestion: return a pointer instead of a reference:

                  Contact* GlobalAll::getContactByUID(const int &UID) {
                      int low = 0, high = this->allContacts.size() - 1;
                  
                      while (low <= high) {
                          int middle = (low + high) >> 1;
                  
                          if (this->allContacts[middle].UID == UID) {
                              return &(this->AllContacts[middle]);
                          }
                  
                          if (this->allContacts[middle].UID < UID) {
                              low = middle + 1;
                          } else {
                              high = middle - 1;
                          }
                      }
                      return nullptr;
                  }
                  
                  ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by A Former User
                  #8

                  @VRonin said in How to return myclass reference?:

                  Contact* GlobalAll::getContactByUID(const int &UID) {

                  Actually I don't see why that is any better than returning nothing at all, void GlobalAll::getContactByUID(const int &UID) { ...

                  VRoninV 1 Reply Last reply
                  0
                  • JohanSoloJ JohanSolo

                    You can't: to return a reference the returned object must exist outside the function scope. To "solve" the issue you must either change the signature to Contact GloballAll::getContactByUID() or to something like bool GloballAll::getContactByUID( ..., Contact& return )

                    K Offline
                    K Offline
                    Konstantin Tokarev
                    wrote on last edited by
                    #9
                    This post is deleted!
                    1 Reply Last reply
                    0
                    • ? A Former User

                      @VRonin said in How to return myclass reference?:

                      Contact* GlobalAll::getContactByUID(const int &UID) {

                      Actually I don't see why that is any better than returning nothing at all, void GlobalAll::getContactByUID(const int &UID) { ...

                      VRoninV Offline
                      VRoninV Offline
                      VRonin
                      wrote on last edited by
                      #10

                      @Wieland I think this is a search function so it must return a "reference" to the object with contact.UID==UID or null if it can't find the item.

                      P.S.
                      If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                      ~Napoleon Bonaparte

                      On a crusade to banish setIndexWidget() from the holy land of Qt

                      Taz742T 1 Reply Last reply
                      2
                      • VRoninV VRonin

                        @Wieland I think this is a search function so it must return a "reference" to the object with contact.UID==UID or null if it can't find the item.

                        P.S.
                        If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                        Taz742T Offline
                        Taz742T Offline
                        Taz742
                        wrote on last edited by Taz742
                        #11

                        @VRonin said in How to return myclass reference?:

                        or null if it can't find the item.

                        No. Contact will be in my QList.

                        @VRonin said in How to return myclass reference?:

                        If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                        I do not know about QHash <T, T>, It's faster than a binary search?
                        If my allContacts.size() == 10 000, 15 Checks i need maximum.

                        Do what you want.

                        jsulmJ 1 Reply Last reply
                        0
                        • Taz742T Taz742

                          @VRonin said in How to return myclass reference?:

                          or null if it can't find the item.

                          No. Contact will be in my QList.

                          @VRonin said in How to return myclass reference?:

                          If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                          I do not know about QHash <T, T>, It's faster than a binary search?
                          If my allContacts.size() == 10 000, 15 Checks i need maximum.

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

                          @Taz742
                          http://doc.qt.io/qt-5/containers.html#algorithmic-complexity

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          Taz742T 1 Reply Last reply
                          2
                          • jsulmJ jsulm

                            @Taz742
                            http://doc.qt.io/qt-5/containers.html#algorithmic-complexity

                            Taz742T Offline
                            Taz742T Offline
                            Taz742
                            wrote on last edited by Taz742
                            #13

                            @jsulm @VRonin Thank guys.
                            Also there are good example http://developers-club.com/posts/170017/

                            @VRonin said in How to return myclass reference?:

                            If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                            I think you are right. Thank.
                            how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                            Do what you want.

                            jsulmJ kshegunovK 2 Replies Last reply
                            0
                            • Taz742T Taz742

                              @jsulm @VRonin Thank guys.
                              Also there are good example http://developers-club.com/posts/170017/

                              @VRonin said in How to return myclass reference?:

                              If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                              I think you are right. Thank.
                              how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

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

                              @Taz742 said in How to return myclass reference?:

                              how much seconds will be lost if I search an element in QList one milion times and how much will be reserved in QHash?

                              Searching in a list is O(n). Statistically you will need n/2 comparisons to find what you're looking for. Hash is O(1) - so much faster. For lookup you should use QHash or QMap not QList.

                              You you want to see the difference then just write a small app and measure the time...

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              1
                              • Taz742T Taz742

                                @jsulm @VRonin Thank guys.
                                Also there are good example http://developers-club.com/posts/170017/

                                @VRonin said in How to return myclass reference?:

                                If you find yourself using this function a lot, consider changing allContacts into a QHash<int,Contact> and use the UID as key

                                I think you are right. Thank.
                                how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                                kshegunovK Offline
                                kshegunovK Offline
                                kshegunov
                                Moderators
                                wrote on last edited by kshegunov
                                #15

                                @Taz742 said in How to return myclass reference?:

                                how much seconds will be lost if I search an element in QList one milion times(if i use binary search) and how much will be reserved in QHash?

                                Algorithmic complexity isn't measured in seconds, but with the so called "big O notation" (asymptotic complexity). Provided you can do a binary search, which implies the list is kept at all times ordered, then the complexity of the search is O(logN). For a hash it's O(1) with worst-case O(N). Now, there are nuances, but most of the time a hash would fare better than a red-black tree (QMap), which would be better than keeping an ordered list and doing a binary search on it. Of course the best is to have everything in a vector and just get the elements by index, but that's not always possible.

                                Read and abide by the Qt Code of Conduct

                                1 Reply Last reply
                                4
                                • ? Offline
                                  ? Offline
                                  A Former User
                                  wrote on last edited by A Former User
                                  #16
                                  • Simple code is better than complex code.
                                  • Only sacrifice simplicity if you have proof that your code is too slow.
                                  • The only way to prove that your code is too slow is by measuring execution time against real world data on the target machine.
                                  • Don't just assume that algorithmic complexity dominates execution time; you have to measure it.

                                  Just my 2 cents.

                                  1 Reply Last reply
                                  6
                                  • K Offline
                                    K Offline
                                    Konstantin Tokarev
                                    wrote on last edited by
                                    #17
                                    • Avoid premature pessimization - by default use data structures and algorithms which are right for the job, without sacrificing simplicity.

                                    Otherwise you may get a death of thousand cuts for performance of your application, when it's not enough to fix a few bottlenecks because all code if uniformly slow.

                                    Taz742T 1 Reply Last reply
                                    4
                                    • K Konstantin Tokarev
                                      • Avoid premature pessimization - by default use data structures and algorithms which are right for the job, without sacrificing simplicity.

                                      Otherwise you may get a death of thousand cuts for performance of your application, when it's not enough to fix a few bottlenecks because all code if uniformly slow.

                                      Taz742T Offline
                                      Taz742T Offline
                                      Taz742
                                      wrote on last edited by
                                      #18

                                      Pleasant discussion.

                                      Do what you want.

                                      1 Reply Last reply
                                      1

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved