简体   繁体   中英

Constructor not initializing object member data

I'm trying to learn C++, but i'm having a little bit of difficulty with this program i'm writing. Essentially, the program writes a rectangle of desired dimensions to the screen. Simple enough. However, I can't get the program to create the rectangle whose dimensions are initialized by the constructor parameters. I put a cout statement in the constructor to verify that the constructor is taking the parameters and initializing the dimension variables, and it seems to be doing its job. When I call the function to draw the rectangle or calculate the area however, it returns nothing and 0, respectively. I'm sure I've made a stupid mistake, but I cant see where I went wrong.

Here is the code:

#include <iostream>

using namespace std;

enum choice {DrawRect=1,GetArea,GetPerim,ChangeDimensions,Quit};

//Rect Class Declaration

class Rectangle
{
public:

// Constructors
Rectangle(int,int);
~Rectangle();

//Accessors

int GetArea() const {return itsLength * itsWidth;}
int GetLength() const   {return itsLength;}
int GetWidth() const    {return itsWidth;}
int GetPerim() const    {return 2*itsWidth + 2*itsLength;}
void ChangeDimensions(int length,int width);

//Member Data

int itsLength;
int itsWidth;
};

//Implementation of Methods not defined inline

Rectangle::Rectangle(int length,int width)
{
    int itsLength = length;
    int itsWidth = width;
    cout << "The constructor is creating a Rectangle with length " << itsLength << " and width " << itsWidth << "\n";
}

Rectangle::~Rectangle() {}

void Rectangle::ChangeDimensions(int length,int width)
{
    itsLength = length;
    itsWidth  = width;
}

int DoMenu();
void    DoDrawRect(Rectangle);
void    DoGetArea(Rectangle);
void    DoGetPerim(Rectangle);

//Main

int main() 
{   
    //Initialize Rectangle theRect
    Rectangle theRect(5,30);

    int fQuit=false;
    int choice = DrawRect;

    while (!fQuit)
    {
        choice = DoMenu();

        if (choice < DrawRect || choice > Quit)
            {
                cout << "Invalid Choice, Try Again.\n\n";
                continue;
            }

        switch(choice)
            {
                case DrawRect:
                    DoDrawRect(theRect);
                    break;
                case GetArea:
                    DoGetArea(theRect); 
                    break;
                case GetPerim:
                    DoGetPerim(theRect);
                    break;
                case ChangeDimensions:
                    int newLength,newWidth;
                    cout << "\nEnter new length: ";
                    cin >> newLength;
                    cout << "\nEnter new width: ";
                    cin >> newWidth;
                    theRect.ChangeDimensions(newLength,newWidth);
                    DoDrawRect(theRect);
                    break;
                case Quit:
                    fQuit=true;
                    cout << "Exiting....\n\n";
                    break;
                default:
                    cout << "Error in Choice!!\n";
                    fQuit=true;
                    break;
            }
    }
    return 0;
}


int DoMenu()
{   
    int choice;
    cout << "\n****************";
    cout << "\n      Menu\n";
    cout << "****************\n";
    cout << "1: Draw Rectangle\n";
    cout << "2: Get Area of Rectangle\n";
    cout << "3: Get Perimeter of Rectangle\n";
    cout << "4: Set Dimensions of Rectangle\n";
    cout << "5: Quit Program\n";
    cout << ": ";
    cin >> choice;
    return choice;
};

void DoGetArea(Rectangle theRect)
{
    cout << "The Area of the Rectangle is " << theRect.GetArea() << "\n";
};

void DoGetPerim(Rectangle theRect)
{
    cout << "The Perimeter of the Rectangle is " << theRect.GetPerim() << "\n";
};

void DoDrawRect(Rectangle theRect)
{
    int width = theRect.GetWidth();
    int length = theRect.GetLength();

    for (int i = 0;i < width;i++)
        {
            for (int j = 0; j < length;j++)
                {   
                    cout << "*";
                }
            cout << "\n";
        }

};

Thanks, I appreciate any help you can give me.

Rectangle::Rectangle(int length,int width)
{
    int itsLength = length;
    int itsWidth = width;
}

In your constructor you're declaring two local variables called itsLength and itsWidth . These override the two identically named variables in your class.

Rectangle::Rectangle(int length,int width)
{
     itsLength = length;
     itsWidth = width;
}

you should remove the int before the variable names

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM