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. Compiler generated assignment operator= question

Compiler generated assignment operator= question

Scheduled Pinned Locked Moved C / C++ / MFC
question
13 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.
  • R Ryan_Roberts

    Not using CArray would be a good start :-D MFC's container classes suck. Try using a stl container instead, it might just change your life. Ryan

    J Offline
    J Offline
    John M Drescher
    wrote on last edited by
    #3

    I agree 100%. I've used the MFC containers for years but STL is much more powerful and more portable. I wish I switched a long time ago. Try std::vector John

    D 1 Reply Last reply
    0
    • D Damir Valiulin

      Suppose I have a class with a few member variables, and one of them is a CArray object, e.g.:

      CMyClass {
      ...
      private:
        int var1, var2, var3;
        bool flag1, flag2, flag3;
        CArray  arSomeArray;
      };
      

      If I didn't have that CArray member, I could simply write:

      CMyClass a, b;
      a = b;
      

      The assignment operator would be simply generated by compiler. But when CArray is there, compiler cannot generate default assigment operator, so I have to add to the class:

      CMyClass& operator= (CMyClass& src){
        var1 = src.var1;
        var2 = src.var2;
        var3 = src.var3;
        flag1 = src.flag1;
        flag2 = src.flag2;
        flag3 = src.flag3;
        arSomArray.Copy (src.arSomeArray);
        return *this;
      }
      

      Not only that it is very tedious writing a few dozen of "x = src.x", it is also prone to bugs. Like later I will add a variable to the class and might forget to add it to the operator= function. Is there a way to write something like below?

      CMyClass& operator= (CMyClass& src){
        dear_compiler_do_what_you_can_with_all_the_variables_i_ll_take_care_of_the_rest();
        arSomArray.Copy (src.arSomeArray);
        return *this;
      }
      

      Thanks

      D Offline
      D Offline
      Dave Bryant
      wrote on last edited by
      #4

      You could declare all the members you want automatically copied in a structure defined within the class - C++ will then generate an assignment operator for that structure. e.g. class Blah { private:   struct Hidden   {     int a;     int b;   };   Hidden h;   CArray<int,int> array;   Blah& operator=(const Blah& copy)   {     h = copy.h;     // Copy the array...   } }; However, as others have pointed out, if you use STL you don't run into these problems. Dave http://www.cloudsofheaven.org

      D 1 Reply Last reply
      0
      • J John M Drescher

        I agree 100%. I've used the MFC containers for years but STL is much more powerful and more portable. I wish I switched a long time ago. Try std::vector John

        D Offline
        D Offline
        Damir Valiulin
        wrote on last edited by
        #5

        Thanks, but I am not going to rewrite a few hundred of classes, possibly breaking several projects along the way, just for this cause. Having CArray with all its upsides and downsides is a must.

        J 1 Reply Last reply
        0
        • D Damir Valiulin

          Thanks, but I am not going to rewrite a few hundred of classes, possibly breaking several projects along the way, just for this cause. Having CArray with all its upsides and downsides is a must.

          J Offline
          J Offline
          John M Drescher
          wrote on last edited by
          #6

          I know what you mean. I have a lot of code in several DLLs that sill has MFC containers and in most cases it is better not to rewrite but I wish I would have known stl in the first place. Anything new I will use stl containers instead of MFC. John

          1 Reply Last reply
          0
          • D Dave Bryant

            You could declare all the members you want automatically copied in a structure defined within the class - C++ will then generate an assignment operator for that structure. e.g. class Blah { private:   struct Hidden   {     int a;     int b;   };   Hidden h;   CArray<int,int> array;   Blah& operator=(const Blah& copy)   {     h = copy.h;     // Copy the array...   } }; However, as others have pointed out, if you use STL you don't run into these problems. Dave http://www.cloudsofheaven.org

            D Offline
            D Offline
            Damir Valiulin
            wrote on last edited by
            #7

            The idea is good, however separating some variables into a structure just for coding convinience would not make sense to someoneelse reading the code.

            D 1 Reply Last reply
            0
            • D Damir Valiulin

              Suppose I have a class with a few member variables, and one of them is a CArray object, e.g.:

              CMyClass {
              ...
              private:
                int var1, var2, var3;
                bool flag1, flag2, flag3;
                CArray  arSomeArray;
              };
              

              If I didn't have that CArray member, I could simply write:

              CMyClass a, b;
              a = b;
              

              The assignment operator would be simply generated by compiler. But when CArray is there, compiler cannot generate default assigment operator, so I have to add to the class:

              CMyClass& operator= (CMyClass& src){
                var1 = src.var1;
                var2 = src.var2;
                var3 = src.var3;
                flag1 = src.flag1;
                flag2 = src.flag2;
                flag3 = src.flag3;
                arSomArray.Copy (src.arSomeArray);
                return *this;
              }
              

              Not only that it is very tedious writing a few dozen of "x = src.x", it is also prone to bugs. Like later I will add a variable to the class and might forget to add it to the operator= function. Is there a way to write something like below?

              CMyClass& operator= (CMyClass& src){
                dear_compiler_do_what_you_can_with_all_the_variables_i_ll_take_care_of_the_rest();
                arSomArray.Copy (src.arSomeArray);
                return *this;
              }
              

              Thanks

              D Offline
              D Offline
              Dean Goodman
              wrote on last edited by
              #8

              What about writing a quick subclass of CArray that defines operator= and simply calls CArray::Copy()? That would still be compatible with your other class that just use CArray. --Dean

              D 1 Reply Last reply
              0
              • D Damir Valiulin

                The idea is good, however separating some variables into a structure just for coding convinience would not make sense to someoneelse reading the code.

                D Offline
                D Offline
                Dave Bryant
                wrote on last edited by
                #9

                I agree it would look weird and non-intuative - which is while i recommend STL. Dave http://www.cloudsofheaven.org

                1 Reply Last reply
                0
                • D Damir Valiulin

                  Suppose I have a class with a few member variables, and one of them is a CArray object, e.g.:

                  CMyClass {
                  ...
                  private:
                    int var1, var2, var3;
                    bool flag1, flag2, flag3;
                    CArray  arSomeArray;
                  };
                  

                  If I didn't have that CArray member, I could simply write:

                  CMyClass a, b;
                  a = b;
                  

                  The assignment operator would be simply generated by compiler. But when CArray is there, compiler cannot generate default assigment operator, so I have to add to the class:

                  CMyClass& operator= (CMyClass& src){
                    var1 = src.var1;
                    var2 = src.var2;
                    var3 = src.var3;
                    flag1 = src.flag1;
                    flag2 = src.flag2;
                    flag3 = src.flag3;
                    arSomArray.Copy (src.arSomeArray);
                    return *this;
                  }
                  

                  Not only that it is very tedious writing a few dozen of "x = src.x", it is also prone to bugs. Like later I will add a variable to the class and might forget to add it to the operator= function. Is there a way to write something like below?

                  CMyClass& operator= (CMyClass& src){
                    dear_compiler_do_what_you_can_with_all_the_variables_i_ll_take_care_of_the_rest();
                    arSomArray.Copy (src.arSomeArray);
                    return *this;
                  }
                  

                  Thanks

                  J Offline
                  J Offline
                  John M Drescher
                  wrote on last edited by
                  #10

                  There is a problem in your assignment operator. If someone assigns an object to itself your code will fail on dynamic data such as CArray. For example: CMyClass A; A=A; //What happens to arSomArray? To solve this I create a private destroy() and copy() functions and implement the copy constructor and assignment operator as follows: PROPERTY::~PROPERTY() { destroy(); } PROPERTY::PROPERTY(PROPERTY & other ) { copy(other); } PROPERTY& PROPERTY::operator =(PROPERTY & other ) { if ( &other != this ) { destroy(); copy( other ); } return *this; } copy() does the copy of data from one class to the other similar to what you did in your assignment operator destroy() deletes any dynamically allocated data. I have an idea to solve your problem that I will post a little bit later. John

                  D 1 Reply Last reply
                  0
                  • J John M Drescher

                    There is a problem in your assignment operator. If someone assigns an object to itself your code will fail on dynamic data such as CArray. For example: CMyClass A; A=A; //What happens to arSomArray? To solve this I create a private destroy() and copy() functions and implement the copy constructor and assignment operator as follows: PROPERTY::~PROPERTY() { destroy(); } PROPERTY::PROPERTY(PROPERTY & other ) { copy(other); } PROPERTY& PROPERTY::operator =(PROPERTY & other ) { if ( &other != this ) { destroy(); copy( other ); } return *this; } copy() does the copy of data from one class to the other similar to what you did in your assignment operator destroy() deletes any dynamically allocated data. I have an idea to solve your problem that I will post a little bit later. John

                    D Offline
                    D Offline
                    Damir Valiulin
                    wrote on last edited by
                    #11

                    Thank you for the reminder. I remember I've read some article on CodeProject about dangers of CArray such assigning to itself or from reference to itself. I will keep this in mind. As for the answer to my problem, Dean Goodman already answered it.

                    J 1 Reply Last reply
                    0
                    • D Dean Goodman

                      What about writing a quick subclass of CArray that defines operator= and simply calls CArray::Copy()? That would still be compatible with your other class that just use CArray. --Dean

                      D Offline
                      D Offline
                      Damir Valiulin
                      wrote on last edited by
                      #12

                      Thank you. This is exactly the answer I was looking for! I derived a class from CArray and added operator= to it. Now compiler has no trouble generating default assignment. Everything works perfectly! :-D

                      1 Reply Last reply
                      0
                      • D Damir Valiulin

                        Thank you for the reminder. I remember I've read some article on CodeProject about dangers of CArray such assigning to itself or from reference to itself. I will keep this in mind. As for the answer to my problem, Dean Goodman already answered it.

                        J Offline
                        J Offline
                        John M Drescher
                        wrote on last edited by
                        #13

                        I was just writing some code for my idea... Anyways make sure you provide a copy constructor otherwise the complier would provide one and circumvent your code for the following code CMyClass a; CMyClass b = a; This code will not call the = operator. It uses the copy constructor... John

                        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