Writing operator functions

Discussion in 'C++' started by valerij, Mar 14, 2007.

  1. valerij

    valerij Guest

    Yes, hi

    How to write "operator +" and "operator =" functions in a class with
    a defined constructor? The following code demonstrates that I don't
    really understand how to do it... I think it has something to do with
    the compiler calling the destructor twice. Could someone point out
    where I go wrong?
    P.S.: The error it gives is "Debug Assertion Failure ....." (at run
    time)
    P.P.S: Everything else works just fine (without the use of "operator
    +"
    and "operator =" functions)

    //code "tested" on Microsoft Visual C++ 6.0
    #include <iostream>

    using namespace std;

    class DatArray {
    public:
    int rows, columns;
    double **a;
    DatArray(int r, int c);
    ~DatArray();
    void operator = (double d1);
    void operator = (DatArray da1); //problematic
    void operator ++ ();
    //DatArray operator + (double d1); //does not work
    };

    DatArray::DatArray(int r, int c) {
    int c1;
    rows = r;
    columns = c;
    a = new double* [rows];
    for (c1 = 0; c1 < rows; c1++) a[c1] = new double [columns];
    }

    DatArray::~DatArray() {
    int c1;
    for (c1 = 0; c1 < rows; c1++) delete [] a[c1];
    delete [] a;
    }

    void DatArray::eek:perator = (double d1) {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2] = d1;
    }

    void DatArray::eek:perator = (DatArray da1) {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2] = da1.a[c1][c2];
    }

    void DatArray::eek:perator ++ () {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2]++;
    }

    /*DatArray DatArray::eek:perator + (double d1) {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2] = a[c1][c2] + d1;
    return *this;
    }*/

    int main() {
    int c1, c2;
    DatArray myarray(3, 4), myarray2(3, 4);
    myarray = 10.1;
    for (c1 = 0; c1 < myarray.rows; c1++) {
    for (c2 = 0; c2 < myarray.columns; c2++) cout << myarray.a[c1][c2]
    << " ";
    cout << endl;
    }
    cout << endl;
    for (c1 = 0; c1 < 100; c1++) myarray++;
    //myarray2 = myarray + 100; //this should be simpler, but does not
    work ?!?!?!?!?!
    myarray2 = myarray;
    for (c1 = 0; c1 < myarray.rows; c1++) {
    for (c2 = 0; c2 < myarray.columns; c2++) cout << myarray2.a[c1][c2]
    << " ";
    cout << endl;
    }
    cin.get(); //currently, after this, ERROR ... WHY?!?!?!?!?! (how to
    fix this?!?!?!?!?)
    return 0;
    }
    //end of code "tested" on Microsoft Visual C++ 6.0

    Thanks,
    Valerij
     
    valerij, Mar 14, 2007
    #1
    1. Advertising

  2. valerij

    Piyo Guest

    valerij wrote:
    > Yes, hi
    >
    > How to write "operator +" and "operator =" functions in a class with
    > a defined constructor? The following code demonstrates that I don't
    > really understand how to do it... I think it has something to do with
    > the compiler calling the destructor twice. Could someone point out
    > where I go wrong?
    > P.S.: The error it gives is "Debug Assertion Failure ....." (at run
    > time)
    > P.P.S: Everything else works just fine (without the use of "operator
    > +"
    > and "operator =" functions)
    >
    > //code "tested" on Microsoft Visual C++ 6.0
    > #include <iostream>
    >
    > using namespace std;
    >
    > class DatArray {
    > public:
    > int rows, columns;
    > double **a;
    > DatArray(int r, int c);
    > ~DatArray();
    > void operator = (double d1);
    > void operator = (DatArray da1); //problematic
    > void operator ++ ();
    > //DatArray operator + (double d1); //does not work
    > };
    >


    My gut instinct tells me you are missing a Copy Constructor.
    I'd have to look at it closely to tell later :)
     
    Piyo, Mar 14, 2007
    #2
    1. Advertising

  3. valerij wrote:
    > Yes, hi
    >
    > How to write "operator +" and "operator =" functions in a class with
    > a defined constructor? The following code demonstrates that I don't
    > really understand how to do it... I think it has something to do with
    > the compiler calling the destructor twice. Could someone point out
    > where I go wrong?
    > P.S.: The error it gives is "Debug Assertion Failure ....." (at run
    > time)
    > P.P.S: Everything else works just fine (without the use of "operator
    > +"
    > and "operator =" functions)
    >
    > //code "tested" on Microsoft Visual C++ 6.0
    > #include <iostream>
    >
    > using namespace std;
    >
    > class DatArray {
    > public:
    > int rows, columns;
    > double **a;
    > DatArray(int r, int c);
    > ~DatArray();
    > void operator = (double d1);
    > void operator = (DatArray da1); //problematic



    You've violated the "Rule of Three". Look it up. Also, consider
    that operator = (the assignment op) should probably take a ref to
    a const object instead of an object.

    > void operator ++ ();
    > //DatArray operator + (double d1); //does not work
    > };
    > [..]


    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, Mar 14, 2007
    #3
  4. valerij

    mlimber Guest

    mlimber, Mar 14, 2007
    #4
  5. valerij

    David Harmon Guest

    On 14 Mar 2007 11:05:35 -0700 in comp.lang.c++, "valerij"
    <> wrote,
    >How to write "operator +" and "operator =" functions in a class with
    >a defined constructor?


    operator+ should usually be

    T operator+(T const & t1, T const & t2)
    {
    T result(t1);
    result += t2;
    return result;
    }

    operator= depends on the requirements of your class, but usually
    you just use operator= of each of the base classes and members.
    (That is the compiler supplied operator= if you do not write one,
    but unfortunately you have to write += yourself.)

    operator+= is a lot like operator= except using += instead of =.
    All the = operators (if you need them) should be members.

    >//code "tested" on Microsoft Visual C++ 6.0


    Failure to upgrade to at least MSVC 7.x may be harmful to your sanity.

    >class DatArray {
    >public:
    > int rows, columns;
    > double **a;


    std::vector<std::vector<double> > a;


    >DatArray::DatArray(int r, int c) {


    DatArray::DatArray(int r, int c)
    : a(r, std::vector<double>(c))
    { }

    >/*DatArray DatArray::eek:perator + (double d1) {
    > int c1, c2;
    > for (c1 = 0; c1 < rows; c1++)
    > for (c2 = 0; c2 < columns; c2++) a[c1][c2] = a[c1][c2] + d1;
    > return *this;
    >}*/


    DatArray & DatArray::eek:perator += (double d1) {
    for (int c1 = 0; c1 < a.size(); c1++)
    for (int c2 = 0; c2 < a[c1].size(); c2++)
    a[c1][c2] += d1;
    return *this;
    }
     
    David Harmon, Mar 14, 2007
    #5
  6. valerij

    valerij Guest

    On Mar 14, 1:05 pm, "valerij" <> wrote:
    > Yes, hi
    >
    > How to write "operator +" and "operator =" functions in a class with
    > a defined constructor? The following code demonstrates that I don't
    > really understand how to do it... I think it has something to do with
    > the compiler calling the destructor twice. Could someone point out
    > where I go wrong?
    > P.S.: The error it gives is "Debug Assertion Failure ....." (at run
    > time)
    > P.P.S: Everything else works just fine (without the use of "operator
    > +"
    > and "operator =" functions)
    >
    > //code "tested" on Microsoft Visual C++ 6.0
    > #include <iostream>
    >
    > using namespace std;
    >
    > class DatArray {
    > public:
    > int rows, columns;
    > double **a;
    > DatArray(int r, int c);
    > ~DatArray();
    > void operator = (double d1);
    > void operator = (DatArray da1); //problematic
    > void operator ++ ();
    > //DatArray operator + (double d1); //does not work
    >
    > };
    >
    > DatArray::DatArray(int r, int c) {
    > int c1;
    > rows = r;
    > columns = c;
    > a = new double* [rows];
    > for (c1 = 0; c1 < rows; c1++) a[c1] = new double [columns];
    >
    > }
    >
    > DatArray::~DatArray() {
    > int c1;
    > for (c1 = 0; c1 < rows; c1++) delete [] a[c1];
    > delete [] a;
    >
    > }
    >
    > void DatArray::eek:perator = (double d1) {
    > int c1, c2;
    > for (c1 = 0; c1 < rows; c1++)
    > for (c2 = 0; c2 < columns; c2++) a[c1][c2] = d1;
    >
    > }
    >
    > void DatArray::eek:perator = (DatArray da1) {
    > int c1, c2;
    > for (c1 = 0; c1 < rows; c1++)
    > for (c2 = 0; c2 < columns; c2++) a[c1][c2] = da1.a[c1][c2];
    >
    > }
    >
    > void DatArray::eek:perator ++ () {
    > int c1, c2;
    > for (c1 = 0; c1 < rows; c1++)
    > for (c2 = 0; c2 < columns; c2++) a[c1][c2]++;
    >
    > }
    >
    > /*DatArray DatArray::eek:perator + (double d1) {
    > int c1, c2;
    > for (c1 = 0; c1 < rows; c1++)
    > for (c2 = 0; c2 < columns; c2++) a[c1][c2] = a[c1][c2] + d1;
    > return *this;
    >
    > }*/
    >
    > int main() {
    > int c1, c2;
    > DatArray myarray(3, 4), myarray2(3, 4);
    > myarray = 10.1;
    > for (c1 = 0; c1 < myarray.rows; c1++) {
    > for (c2 = 0; c2 < myarray.columns; c2++) cout << myarray.a[c1][c2]
    > << " ";
    > cout << endl;
    > }
    > cout << endl;
    > for (c1 = 0; c1 < 100; c1++) myarray++;
    > //myarray2 = myarray + 100; //this should be simpler, but does not
    > work ?!?!?!?!?!
    > myarray2 = myarray;
    > for (c1 = 0; c1 < myarray.rows; c1++) {
    > for (c2 = 0; c2 < myarray.columns; c2++) cout << myarray2.a[c1][c2]
    > << " ";
    > cout << endl;
    > }
    > cin.get(); //currently, after this, ERROR ... WHY?!?!?!?!?! (how to
    > fix this?!?!?!?!?)
    > return 0;}
    >
    > //end of code "tested" on Microsoft Visual C++ 6.0
    >
    > Thanks,
    > Valerij


    Hi again,

    I seem to have figured it out. You have to use pointers. The working
    code is below. My next question is how to implement the following:

    DatArray* operator + (DatArray da1);

    Thanks,
    Valerij

    //code tested on Microsoft Visual C++ 6.0
    #include <iostream>

    using namespace std;

    class DatArray {
    public:
    int rows, columns;
    int name;
    double **a;
    DatArray(int r, int c);
    ~DatArray();
    void operator = (double d1);
    void operator = (int i1);
    void operator = (DatArray* da1);
    DatArray* operator + (double d1);
    DatArray* operator - (double d1);
    DatArray* operator * (double d1);
    DatArray* operator / (double d1);
    void operator ++ ();
    void operator -- ();
    };

    DatArray::DatArray(int r, int c) {
    int c1;
    rows = r;
    columns = c;
    a = new double* [rows];
    for (c1 = 0; c1 < rows; c1++) a[c1] = new double [columns];
    name = 0;
    }

    DatArray::~DatArray() {
    int c1;
    cout << "Destroying " << name << endl;
    for (c1 = 0; c1 < rows; c1++) delete [] a[c1];
    delete [] a;
    }

    void DatArray::eek:perator = (double d1) {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2] = d1;
    }

    void DatArray::eek:perator = (int i1) {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2] = i1;
    }

    void DatArray::eek:perator = (DatArray* da1) {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2] = da1->a[c1][c2];
    }

    void DatArray::eek:perator ++ () {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2]++;
    }

    void DatArray::eek:perator -- () {
    int c1, c2;
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) a[c1][c2]--;
    }

    DatArray* DatArray::eek:perator + (double d1) {
    int c1, c2;
    DatArray *da1;
    da1 = new DatArray(rows, columns);
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) da1->a[c1][c2] = a[c1][c2] + d1;
    return da1;
    }

    DatArray* DatArray::eek:perator - (double d1) {
    int c1, c2;
    DatArray *da1;
    da1 = new DatArray(rows, columns);
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) da1->a[c1][c2] = a[c1][c2] - d1;
    return da1;
    }

    DatArray* DatArray::eek:perator * (double d1) {
    int c1, c2;
    DatArray *da1;
    da1 = new DatArray(rows, columns);
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) da1->a[c1][c2] = a[c1][c2] * d1;
    return da1;
    }

    DatArray* DatArray::eek:perator / (double d1) {
    int c1, c2;
    DatArray *da1;
    da1 = new DatArray(rows, columns);
    for (c1 = 0; c1 < rows; c1++)
    for (c2 = 0; c2 < columns; c2++) da1->a[c1][c2] = a[c1][c2] / d1;
    return da1;
    }

    int main() {
    int c1, c2;
    DatArray myarray(3, 4), myarray2(3, 4);

    myarray.name = 1;
    myarray2.name = 2;

    myarray = 0;
    myarray2 = 300;
    myarray = myarray2 + 1000;
    myarray2 = myarray / 100;

    for (c1 = 0; c1 < myarray.rows; c1++) {
    for (c2 = 0; c2 < myarray.columns; c2++) cout << myarray.a[c1][c2]
    << " ";
    cout << endl;
    }
    cout << endl;
    for (c1 = 0; c1 < myarray.rows; c1++) {
    for (c2 = 0; c2 < myarray.columns; c2++) cout << myarray2.a[c1][c2]
    << " ";
    cout << endl;
    }

    return 0;
    }
    //end of code tested on Microsoft Visual C++ 6.0
     
    valerij, Mar 14, 2007
    #6
  7. valerij

    valerij Guest

    On Mar 14, 1:22 pm, "Victor Bazarov" <> wrote:
    > valerij wrote:
    > > Yes, hi

    >
    > > How to write "operator +" and "operator =" functions in a class with
    > > a defined constructor? The following code demonstrates that I don't
    > > really understand how to do it... I think it has something to do with
    > > the compiler calling the destructor twice. Could someone point out
    > > where I go wrong?
    > > P.S.: The error it gives is "Debug Assertion Failure ....." (at run
    > > time)
    > > P.P.S: Everything else works just fine (without the use of "operator
    > > +"
    > > and "operator =" functions)

    >
    > > //code "tested" on Microsoft Visual C++ 6.0
    > > #include <iostream>

    >
    > > using namespace std;

    >
    > > class DatArray {
    > > public:
    > > int rows, columns;
    > > double **a;
    > > DatArray(int r, int c);
    > > ~DatArray();
    > > void operator = (double d1);
    > > void operator = (DatArray da1); //problematic

    >
    > You've violated the "Rule of Three". Look it up. Also, consider
    > that operator = (the assignment op) should probably take a ref to
    > a const object instead of an object.
    >
    > > void operator ++ ();
    > > //DatArray operator + (double d1); //does not work
    > > };
    > > [..]

    >
    > V
    > --
    > Please remove capital 'A's when replying by e-mail
    > I do not respond to top-posted replies, please don't ask


    OMG. I never heard of it ... just looking at it now ... this might
    just be what i always wanted to know ...
    thanks
     
    valerij, Mar 14, 2007
    #7
  8. valerij

    valerij Guest

    On Mar 14, 1:58 pm, David Harmon <> wrote:
    > On 14 Mar 2007 11:05:35 -0700 in comp.lang.c++, "valerij"
    > <> wrote,
    >
    > >How to write "operator +" and "operator =" functions in a class with
    > >a defined constructor?

    >
    > operator+ should usually be
    >
    > T operator+(T const & t1, T const & t2)
    > {
    > T result(t1);
    > result += t2;
    > return result;
    > }
    >
    > operator= depends on the requirements of your class, but usually
    > you just use operator= of each of the base classes and members.
    > (That is the compiler supplied operator= if you do not write one,
    > but unfortunately you have to write += yourself.)
    >
    > operator+= is a lot like operator= except using += instead of =.
    > All the = operators (if you need them) should be members.
    >
    > >//code "tested" on Microsoft Visual C++ 6.0

    >
    > Failure to upgrade to at least MSVC 7.x may be harmful to your sanity.
    >
    > >class DatArray {
    > >public:
    > > int rows, columns;
    > > double **a;

    >
    > std::vector<std::vector<double> > a;
    >
    > >DatArray::DatArray(int r, int c) {

    >
    > DatArray::DatArray(int r, int c)
    > : a(r, std::vector<double>(c))
    > { }
    >
    > >/*DatArray DatArray::eek:perator + (double d1) {
    > > int c1, c2;
    > > for (c1 = 0; c1 < rows; c1++)
    > > for (c2 = 0; c2 < columns; c2++) a[c1][c2] = a[c1][c2] + d1;
    > > return *this;
    > >}*/

    >
    > DatArray & DatArray::eek:perator += (double d1) {
    > for (int c1 = 0; c1 < a.size(); c1++)
    > for (int c2 = 0; c2 < a[c1].size(); c2++)
    > a[c1][c2] += d1;
    > return *this;
    >
    > }


    You see, I have Windows 98SE, so any higher and it will be just too
    slow ;)
     
    valerij, Mar 14, 2007
    #8
  9. valerij

    David Harmon Guest

    On 14 Mar 2007 12:50:26 -0700 in comp.lang.c++, "valerij"
    <> wrote,
    >You see, I have Windows 98SE, so any higher and it will be just too
    >slow ;)


    OK, that's a side issue. Don't neglect the part about getting rid of
    the raw pointers and raw arrays. Prefer std::vector in application
    level code.

    Digital Mars C++ is very efficient under '98, and far more standard-
    conforming than VC6. http://digitalmars.com
     
    David Harmon, Mar 15, 2007
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. HNguyen
    Replies:
    4
    Views:
    2,408
    HNguyen
    Dec 21, 2004
  2. Xiangliang Meng
    Replies:
    1
    Views:
    1,609
    Victor Bazarov
    Jun 21, 2004
  3. Jonathan de Boyne Pollard

    Re: Writing an 'operator='

    Jonathan de Boyne Pollard, Aug 10, 2004, in forum: C++
    Replies:
    0
    Views:
    357
    Jonathan de Boyne Pollard
    Aug 10, 2004
  4. Mark Stijnman
    Replies:
    4
    Views:
    333
    Mark Stijnman
    May 12, 2005
  5. CodeCracker
    Replies:
    8
    Views:
    348
    Howard
    Jun 9, 2006
Loading...

Share This Page