Programming Forums

Programming Forums (http://www.programmingforums.org/forumindex.php)
-   C++ (http://www.programmingforums.org/forum15.html)
-   -   A class with operator overloading (http://www.programmingforums.org/showthread.php?t=8612)

Eric the Red Feb 27th, 2006 1:13 PM

A class with operator overloading
 
I'm new to c++. I recently read a book on it. After reading the book i just wanted to get some practical experience. Now i'm trying to get "operator overloading" to work. I have a Car class and all i want to do is increment the Honda's speed by 1, (from the Car class). Doing "++Honda" (Honda is the object). However, Instead of increamenting by 1 it increments by approx ONE HUNDRED MILLION. What am i doing wrong??

:

#include <iostream>
#include <stdlib.h>

class Car
{
public:
    Car();
    ~Car();
    int GetSpeed() {return *itsSpeed;}
    void SetSpeed (int speed) { *itsSpeed = speed;}
    void Speeding();
    void Speed() { *itsSpeed = *itsSpeed + 1;}
    const Car& operator++ ();
private:
    int * itsSpeed;
    int * itsFuel;
};
   
Car::Car()
{
    itsSpeed = new int(10);
    itsFuel = new int(20);
}

Car::~Car()
{
    delete itsSpeed;
    delete itsFuel;
}

const Car& Car::operator++()
{
    * ++itsSpeed;
}

void Car::Speeding()
{
    if (* itsSpeed > (30))
    {
        std::cout << "You are over the speed limit, please slow down. Your going " << *itsSpeed << " KM/H \n";
    }
    else
    {
        std::cout << "Your under the speed limit. Your at " << *itsSpeed << " KM/H at the moment.\n";
    }
}
int main()
{
    //int CarSpeed;
 
    Car * Honda = new Car;
    Honda->Speeding();   
    Honda->SetSpeed(45);
    Honda->Speeding();
    Honda->Speed();
    Honda->Speeding();
    ++Honda;
    Honda->Speeding();
    ++Honda;
    Honda->Speeding();
         
    delete Honda;
    system("Pause");
    return 0;
}


Kaja Fumei Feb 27th, 2006 1:33 PM

With unary operators, they are evaluated right to left, not left to right, so in your code, the ++ operation is done to itsSpeed before *. This causes the pointer to be incremented, rather than the value stored at the pointer's address, which is what you meant to do.

Simple fix:
:

++*itsSpeed;

Eric the Red Feb 27th, 2006 1:43 PM

Thanks for your help. Unfortunately, this doesn't seem to fix the problem. I tried

:

const Car& Car::operator++()
{
    ++ (* itsSpeed);
}

// and

const Car& Car::operator++()
{
    ++ * itsSpeed;
}


The result, still give me a value in the millions when incremented. Just try running the program and you'll see.

Klarre Feb 27th, 2006 1:56 PM

You also have to change on the Honda object.

Kaja Fumei Feb 27th, 2006 2:02 PM

I see the problem now, I wasn't paying too much attention before. Overloaded operators can only be used on the the object "value". If you declare a pointer to an object, any operators you do on that pointer will be done to the pointer, not to the data. So you must declare the car on the stack or if you have a pointer to a Car (call the pointer variable Honda), you can use ++*Honda.

Method one:
:

    Car Honda;
    Honda.Speeding();   
    Honda.SetSpeed(45);
    Honda.Speeding();
    Honda.Speed();
    Honda.Speeding();
    ++Honda;
    Honda.Speeding();
    ++Honda;
    Honda.Speeding();


Method 2:
:

    Car * Honda2 = new Car;
    Honda2->Speeding();   
    Honda2->SetSpeed(45);
    Honda2->Speeding();
    Honda2->Speed();
    Honda2->Speeding();
    ++*Honda2;
    Honda2->Speeding();
    ++*Honda2;
    Honda2->Speeding();
   
    delete Honda2;


I ran your code on both of these and it worked fine.

Eric the Red Feb 27th, 2006 2:02 PM

Yeah ur right.. and wow can these pointers can get tedius.

I'm using pointers in this class to get practice with it. However, is there really a point to be using pointers in this program?

Polyphemus_ Feb 27th, 2006 2:05 PM

Quote:

Originally Posted by Eric the Red
However, is there really a point to be using pointers in this program?

Well, there is always a point, but in this case no need. Since you exactly know how much memory you are using (basically a car object, and two integers) there is indeed no need for them.
It is good to practice them though, because practice makes perfect (it is said) ;).


All times are GMT -5. The time now is 4:39 PM.

Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC