构造函数未初始化对象成员数据

时间:2013-09-29 22:06:05

标签: c++ constructor

我正在尝试学习C ++,但我正在写这个程序有点困难。本质上,程序将所需尺寸的矩形写入屏幕。很简单。但是,我无法让程序创建尺寸由构造函数参数初始化的矩形。我在构造函数中放置了一个cout语句来验证构造函数是否正在获取参数并初始化维度变量,它似乎正在完成它的工作。当我调用函数绘制矩形或计算区域时,它分别返回0和0。我确定我犯了一个愚蠢的错误,但我不知道我哪里出错了。

以下是代码:

#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";
        }

};

谢谢,我感谢你能给我的任何帮助。

2 个答案:

答案 0 :(得分:3)

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

在构造函数中,您声明了两个名为itsLengthitsWidth本地变量。这些覆盖了类中两个同名的变量。

答案 1 :(得分:1)

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

你应该在变量名之前删除int