Конструктор, не инициализирующий данные элемента объекта

#c #pointers #linked-list #segmentation-fault #singly-linked-list

Вопрос:

Я пытаюсь выучить C , но у меня возникли некоторые трудности с этой программой, которую я пишу. По сути, программа записывает на экран прямоугольник нужных размеров. Все достаточно просто. Однако я не могу заставить программу создать прямоугольник, размеры которого инициализируются параметрами конструктора. Я поместил инструкцию cout в конструктор, чтобы убедиться, что конструктор принимает параметры и инициализирует переменные измерения, и, похоже, он выполняет свою работу. Однако, когда я вызываю функцию для рисования прямоугольника или вычисления площади, она не возвращает ничего и 0 соответственно. Я уверен, что совершил глупую ошибку, но я не вижу, где я ошибся.

Вот код:

 #include lt;iostreamgt;  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 lt;lt; "The constructor is creating a Rectangle with length " lt;lt; itsLength lt;lt; " and width " lt;lt; itsWidth lt;lt; "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 lt; DrawRect || choice gt; Quit)  {  cout lt;lt; "Invalid Choice, Try Again.nn";  continue;  }   switch(choice)  {  case DrawRect:  DoDrawRect(theRect);  break;  case GetArea:  DoGetArea(theRect);   break;  case GetPerim:  DoGetPerim(theRect);  break;  case ChangeDimensions:  int newLength,newWidth;  cout lt;lt; "nEnter new length: ";  cin gt;gt; newLength;  cout lt;lt; "nEnter new width: ";  cin gt;gt; newWidth;  theRect.ChangeDimensions(newLength,newWidth);  DoDrawRect(theRect);  break;  case Quit:  fQuit=true;  cout lt;lt; "Exiting....nn";  break;  default:  cout lt;lt; "Error in Choice!!n";  fQuit=true;  break;  }  }  return 0; }   int DoMenu() {   int choice;  cout lt;lt; "n****************";  cout lt;lt; "n Menun";  cout lt;lt; "****************n";  cout lt;lt; "1: Draw Rectanglen";  cout lt;lt; "2: Get Area of Rectanglen";  cout lt;lt; "3: Get Perimeter of Rectanglen";  cout lt;lt; "4: Set Dimensions of Rectanglen";  cout lt;lt; "5: Quit Programn";  cout lt;lt; ": ";  cin gt;gt; choice;  return choice; };  void DoGetArea(Rectangle theRect) {  cout lt;lt; "The Area of the Rectangle is " lt;lt; theRect.GetArea() lt;lt; "n"; };  void DoGetPerim(Rectangle theRect) {  cout lt;lt; "The Perimeter of the Rectangle is " lt;lt; theRect.GetPerim() lt;lt; "n"; };  void DoDrawRect(Rectangle theRect) {  int width = theRect.GetWidth();  int length = theRect.GetLength();   for (int i = 0;i lt; width;i  )  {  for (int j = 0; j lt; length;j  )  {   cout lt;lt; "*";  }  cout lt;lt; "n";  }  };  

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

Комментарии:

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

2. Обычной практикой для различения членов от локальных переменных является их префикс «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; }  

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

Комментарии:

1. Операция либо использует Visual Studio (что позволяет это делать без ошибок), либо использует GCC без использования «-Wshadow» (что вызвало бы предупреждение/ошибку об этом). Если вы используете GCC, привыкните указывать компилятору «-Wall», чтобы получать как можно больше ошибок/отчетов.

2. Большое спасибо! Это решило проблему. Проблема всегда прямо у вас перед глазами :p

Ответ №2:

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

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