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

Posted

技术标签:

【中文标题】构造函数未初始化对象成员数据【英文标题】:Constructor not initializing object member data 【发布时间】:2013-09-29 22:06:04 【问题描述】:

我正在尝试学习 C++,但是我正在编写的这个程序有点困难。本质上,程序将所需尺寸的矩形写入屏幕。很简单。但是,我无法让程序创建其尺寸由构造函数参数初始化的矩形。我在构造函数中放置了一条 cout 语句,以验证构造函数是否正在获取参数并初始化维度变量,并且它似乎正在完成它的工作。但是,当我调用该函数来绘制矩形或计算面积时,它分别返回任何内容和 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";
        

;

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

【问题讨论】:

哦,我忘了说,如果我用 ChangeDimensions() 函数初始化变量 itsWidth 和 itsLength,程序将打印矩形并计算其面积,没有任何问题。 区分成员和局部变量的一种常见做法是在它们前面加上“m_”(同样,s_ 表示静态,g_ 表示全局变量等)。有些人喜欢使用“_”作为参数的后缀,例如Rectangle::Rectangle(int width_, int length_) : m_width(width_), m_length(length_) 【参考方案1】:
Rectangle::Rectangle(int length,int width)

    int itsLength = length;
    int itsWidth = width;

在您的构造函数中,您声明了两个 本地 变量,分别称为 itsLengthitsWidth。它们会覆盖您的类中两个同名的变量。

【讨论】:

OP 要么使用 Visual Studio(它允许这种情况发生而不会出现错误),要么使用 GCC 而不使用“-Wshadow”(这会产生警告/错误)。如果您使用的是 GCC,请养成为编译器指定“-Wall”的习惯,以获得尽可能多的错误/报告。 非常感谢!这解决了它。问题总是在你眼前:p【参考方案2】:
Rectangle::Rectangle(int length,int width)

     itsLength = length;
     itsWidth = width;

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

【讨论】:

以上是关于构造函数未初始化对象成员数据的主要内容,如果未能解决你的问题,请参考以下文章

C++构造函数-对象的初始化

C++的构造函数的作用:初始化类对象的数据成员

C++的构造函数的作用:初始化类对象的数据成员

C++的构造函数的作用:初始化类对象的数据成员

如何通过类构造函数创建成员对象?

构造函数和初始化列表