#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 перед именами переменных