2013-09-29 5 views
1

Я пытаюсь изучить 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"; 
     } 

}; 

Спасибо, я признателен за любую помощь вы можете дать мне.

+0

О, я забыл упомянуть, что если я инициализировать переменные itsWidth и itsLength с ChangeDimensions() функции, то программа будет печатать прямоугольник и вычислить его без проблем. – ChimpanzeeAcneback

+0

Общей практикой для выделения членов из локальных переменных является их префикс «m_» (а также s_ для статики, g_ для глобальных переменных и т. Д.). Некоторым людям нравится использовать «_» в качестве суффикса для параметров, например. 'Rectangle :: Rectangle (int width_, int length_): m_width (width_), m_length (length_) {}' – kfsone

ответ

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

В конструкторе вы объявить два местных переменными называется itsLength и itsWidth. Они переопределяют две одинаково названные переменные в вашем классе.

+0

OP либо использует Visual Studio (что позволяет это происходить без ошибок), либо с помощью GCC без использования "-Wshadow" (что сделало бы предупреждение/ошибку). Если вы используете GCC, заходите в привычку указывать «-Wall» компилятору, чтобы получить большинство ошибок/отчетов, которые вы можете. – kfsone

+0

Я использую GCC. – ChimpanzeeAcneback

+0

Спасибо большое! Это решило это. Проблема всегда прямо перед вашими глазами: p – ChimpanzeeAcneback

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

вы должны удалить Int до имен переменных

Смежные вопросы