Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. managing objects derived from the same base class using a container

managing objects derived from the same base class using a container

Scheduled Pinned Locked Moved C / C++ / MFC
c++graphicsdockerdata-structuresquestion
16 Posts 5 Posters 0 Views 1 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.
  • C Offline
    C Offline
    Calin Negru
    wrote on last edited by
    #1

    I can`t think of a way to store in an array objects of different type but with same base class so I`m going to use a STL container instead:

    class somebaseclass
    {

    }
    class derivedclass: private somebaseclass
    {

    }
    class anotherderivedclass: private somebaseclass
    {

    }

    vector * AllObjects;
    derivedclass * Derived1 = new derivedclass[1];
    anotherderivedclass * Derived2 = new anotherderivedclass[1];

    AllObjects->push_back((somebaseclass)Derived1);
    AllObjects->push_back((somebaseclass)Derived2);

    Is this how it should be done?

    Mircea NeacsuM Greg UtasG L 3 Replies Last reply
    0
    • C Calin Negru

      I can`t think of a way to store in an array objects of different type but with same base class so I`m going to use a STL container instead:

      class somebaseclass
      {

      }
      class derivedclass: private somebaseclass
      {

      }
      class anotherderivedclass: private somebaseclass
      {

      }

      vector * AllObjects;
      derivedclass * Derived1 = new derivedclass[1];
      anotherderivedclass * Derived2 = new anotherderivedclass[1];

      AllObjects->push_back((somebaseclass)Derived1);
      AllObjects->push_back((somebaseclass)Derived2);

      Is this how it should be done?

      Mircea NeacsuM Offline
      Mircea NeacsuM Offline
      Mircea Neacsu
      wrote on last edited by
      #2

      That works but the more modern (and safe) way to do it is to use unique_ptr instead of raw pointers. Something like this:

      std::unique_ptr p1 = make_unique(args1);
      std::unique_ptr p2 = make_unique(args2);

      std::vector> container;
      container.push_back (p1);
      container.push_back (p2);

      Mircea

      1 Reply Last reply
      0
      • C Calin Negru

        I can`t think of a way to store in an array objects of different type but with same base class so I`m going to use a STL container instead:

        class somebaseclass
        {

        }
        class derivedclass: private somebaseclass
        {

        }
        class anotherderivedclass: private somebaseclass
        {

        }

        vector * AllObjects;
        derivedclass * Derived1 = new derivedclass[1];
        anotherderivedclass * Derived2 = new anotherderivedclass[1];

        AllObjects->push_back((somebaseclass)Derived1);
        AllObjects->push_back((somebaseclass)Derived2);

        Is this how it should be done?

        Greg UtasG Offline
        Greg UtasG Offline
        Greg Utas
        wrote on last edited by
        #3

        Yes. If objects belong to different classes, the only way to store them in a container is to use pointers, because the container allocates the same amount of memory for each entry. If you also want the container to delete an entry when you erase it, declare it as, for example, vector>.

        Robust Services Core | Software Techniques for Lemmings | Articles
        The fox knows many things, but the hedgehog knows one big thing.

        <p><a href="https://github.com/GregUtas/robust-services-core/blob/master/README.md">Robust Services Core</a>
        <em>The fox knows many things, but the hedgehog knows one big thing.</em></p>

        C 1 Reply Last reply
        0
        • C Calin Negru

          I can`t think of a way to store in an array objects of different type but with same base class so I`m going to use a STL container instead:

          class somebaseclass
          {

          }
          class derivedclass: private somebaseclass
          {

          }
          class anotherderivedclass: private somebaseclass
          {

          }

          vector * AllObjects;
          derivedclass * Derived1 = new derivedclass[1];
          anotherderivedclass * Derived2 = new anotherderivedclass[1];

          AllObjects->push_back((somebaseclass)Derived1);
          AllObjects->push_back((somebaseclass)Derived2);

          Is this how it should be done?

          L Offline
          L Offline
          Lost User
          wrote on last edited by
          #4

          Yes, except for: 1. Why are you using an array size reference in your instantiations? All you should need is:

          derivedclass * Derived1 = new derivedclass();

          2. Your container is defined to use somebaseclass * types, so your calls to push_back should be:

          AllObject->push_back((somebaseclass*)Derived1);

          or better still, using proper C++ casts:

          AllObject->push_back(reinterpret_cast(Derived1));

          C 2 Replies Last reply
          0
          • L Lost User

            Yes, except for: 1. Why are you using an array size reference in your instantiations? All you should need is:

            derivedclass * Derived1 = new derivedclass();

            2. Your container is defined to use somebaseclass * types, so your calls to push_back should be:

            AllObject->push_back((somebaseclass*)Derived1);

            or better still, using proper C++ casts:

            AllObject->push_back(reinterpret_cast(Derived1));

            C Offline
            C Offline
            Calin Negru
            wrote on last edited by
            #5

            thanks, that helps.

            L 1 Reply Last reply
            0
            • Greg UtasG Greg Utas

              Yes. If objects belong to different classes, the only way to store them in a container is to use pointers, because the container allocates the same amount of memory for each entry. If you also want the container to delete an entry when you erase it, declare it as, for example, vector>.

              Robust Services Core | Software Techniques for Lemmings | Articles
              The fox knows many things, but the hedgehog knows one big thing.

              C Offline
              C Offline
              Calin Negru
              wrote on last edited by
              #6

              Quote:

              because the container allocates the same amount of memory for each entry

              that is an interesting fact

              1 Reply Last reply
              0
              • C Calin Negru

                thanks, that helps.

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #7

                You are welcome. I also think @Mircea-Neacsu's advice about unique_ptr is well worth taking.

                C 1 Reply Last reply
                0
                • L Lost User

                  You are welcome. I also think @Mircea-Neacsu's advice about unique_ptr is well worth taking.

                  C Offline
                  C Offline
                  Calin Negru
                  wrote on last edited by
                  #8

                  pointers from a library, that`s a topic that`s a bit too advanced or complicated for my present day understanding.

                  K L 2 Replies Last reply
                  0
                  • C Calin Negru

                    pointers from a library, that`s a topic that`s a bit too advanced or complicated for my present day understanding.

                    K Offline
                    K Offline
                    k5054
                    wrote on last edited by
                    #9

                    If you can handle raw pointers, then C++ smart pointers should be easy to understand. Google for C++ unique_pointer tutorial and read through a few of the returned hits. It's fairly straight forward, and in general new C++ development should use the smart pointers instead of using raw (e.g. new/delete).

                    Keep Calm and Carry On

                    C 1 Reply Last reply
                    0
                    • C Calin Negru

                      pointers from a library, that`s a topic that`s a bit too advanced or complicated for my present day understanding.

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #10

                      It's a lot simpler than classes and inheritance. :laugh:

                      C 1 Reply Last reply
                      0
                      • K k5054

                        If you can handle raw pointers, then C++ smart pointers should be easy to understand. Google for C++ unique_pointer tutorial and read through a few of the returned hits. It's fairly straight forward, and in general new C++ development should use the smart pointers instead of using raw (e.g. new/delete).

                        Keep Calm and Carry On

                        C Offline
                        C Offline
                        Calin Negru
                        wrote on last edited by
                        #11

                        The problem is I hate complicated syntax. Containers are already complicated syntax for me, combine that with another object (pointer) from a library and it becomes unintelligible mess. I will use a complicated feature when I really need to use it and there is no other way around it. Usually I need to use a feature a couple months before I can move on to something more complicated.

                        1 Reply Last reply
                        0
                        • L Lost User

                          It's a lot simpler than classes and inheritance. :laugh:

                          C Offline
                          C Offline
                          Calin Negru
                          wrote on last edited by
                          #12

                          Richard you really think so?

                          L 1 Reply Last reply
                          0
                          • C Calin Negru

                            Richard you really think so?

                            L Offline
                            L Offline
                            Lost User
                            wrote on last edited by
                            #13

                            Did you notice the :laugh: icon?

                            C 1 Reply Last reply
                            0
                            • L Lost User

                              Did you notice the :laugh: icon?

                              C Offline
                              C Offline
                              Calin Negru
                              wrote on last edited by
                              #14

                              ok, it was a joke

                              1 Reply Last reply
                              0
                              • L Lost User

                                Yes, except for: 1. Why are you using an array size reference in your instantiations? All you should need is:

                                derivedclass * Derived1 = new derivedclass();

                                2. Your container is defined to use somebaseclass * types, so your calls to push_back should be:

                                AllObject->push_back((somebaseclass*)Derived1);

                                or better still, using proper C++ casts:

                                AllObject->push_back(reinterpret_cast(Derived1));

                                C Offline
                                C Offline
                                Calin Negru
                                wrote on last edited by
                                #15

                                I guess converting the object(pointer) back to it`s original form when time comes to use it somewhere works the same

                                derivedclass * DerClpointer1 = (derivedclass *)AllObjects->at(0);

                                Is there a way to check is the conversion is valid? like if an object is of a certain type. For instance how do I convert all objects to their derived state type in a for loop?

                                for(int i =0; i< AllObjects->size();i++ )
                                {
                                // if AllObjects->at(i) is of type derivedclass covert to derivedclass
                                }

                                L 1 Reply Last reply
                                0
                                • C Calin Negru

                                  I guess converting the object(pointer) back to it`s original form when time comes to use it somewhere works the same

                                  derivedclass * DerClpointer1 = (derivedclass *)AllObjects->at(0);

                                  Is there a way to check is the conversion is valid? like if an object is of a certain type. For instance how do I convert all objects to their derived state type in a for loop?

                                  for(int i =0; i< AllObjects->size();i++ )
                                  {
                                  // if AllObjects->at(i) is of type derivedclass covert to derivedclass
                                  }

                                  L Offline
                                  L Offline
                                  Lost User
                                  wrote on last edited by
                                  #16

                                  Calin Cali wrote:

                                  guess converting the object(pointer) back to it`s original form when time comes to use it somewhere works the same

                                  Yes it should do, but you need to run some tests to make sure.

                                  1 Reply Last reply
                                  0
                                  Reply
                                  • Reply as topic
                                  Log in to reply
                                  • Oldest to Newest
                                  • Newest to Oldest
                                  • Most Votes


                                  • Login

                                  • Don't have an account? Register

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Categories
                                  • Recent
                                  • Tags
                                  • Popular
                                  • World
                                  • Users
                                  • Groups