2014-09-28 2 views
0

У меня возникли проблемы с попыткой запустить эту программу, если пользователь вводит «y», который они хотели бы продолжить. Я супер новичок в программировании, так что любая помощь очень ценится. Я полагал, что лучше всего было добавить do/while в основном и как k пользователю, если они хотели бы продолжить работу в конце кода, но я быстро понял, что это не сработает, если я не позвоню предыдущим методам ввода пользователя и выход. Именно здесь возникает проблема.C++ do/while цикл и вызывающие функции?

Еще раз спасибо за помощь!

/* 

• Ask the user if they want to enter the data again (y/n). 
• If ’n’, then the program ends, otherwise it should clear the student class object and 
repeat the loop (ask the user to enter new data...). 

*/ 
#include <iostream> 
#include <cstdlib> 
#include <string> 

using namespace std; 

class Student { 
    public: 
    Student(); 
    ~Student(); 
    void InputData();  // Input all data from user 
    void OutputData();  // Output class list to console 
    void ResetClasses();  // Reset class list 
    Student& operator =(const Student& rightSide); // Assignment operator 

private: 
    string name; 
    int numClasses; 
    string *classList; 
}; 


//array intialized to NULL 
Student::Student() { 
    numClasses = 0; 
    classList = NULL; 
    name = ""; 
} 

//Frees up any memory of array 
Student::~Student() { 

if(classList != NULL) { 
    delete [] classList; 
} 
} 

// This method deletes the class list 
// ====================== 
void Student::ResetClasses() { 
    if(classList != NULL) { 
     delete [ ] classList; 
     classList = NULL; 
} 
numClasses = 0; 
} 



//inputs all data from user (i.e. number of classes) 
//using an array to store classes 
void Student::InputData() { 
int i; 

// Resets the class list in case the method 
// was called again and array wasn't cleared 
ResetClasses(); 

cout << "Enter student name." << endl; 
getline(cin, name); 
cout << "Enter number of classes." << endl; 
cin >> numClasses; 
cin.ignore(2,'\n'); // Discard extra newline 
if (numClasses > 0) { 
    //array to hold number of classes 
    classList = new string[numClasses]; 
    // Loops through # of classes, inputting name of each into array 
    for (i=0; i<numClasses; i++) { 
     cout << "Enter name of class " << (i+1) << endl; 
     getline(cin, classList[i]); 
    } 
} 
cout << endl; 
} 

// This method outputs the data entered by the user. 
void Student::OutputData() { 

int i; 
cout << "Name: " << name << endl; 
cout << "Number of classes: " << numClasses << endl; 
for (i=0; i<numClasses; i++) { 
    cout << " Class " << (i+1) << ":" << classList[i] << endl; 
} 
cout << endl; 
} 


/*This method copies a new classlist to target of assignment. If the operator isn't overloaded  there would be two references to the same class list.*/ 
Student& Student::operator =(const Student& rightSide) { 

int i; 
// Erases the list of classes 
ResetClasses(); 
name = rightSide.name; 
numClasses = rightSide.numClasses; 

// Copies the list of classes 
if (numClasses > 0) { 
    classList = new string[numClasses]; 
    for (i=0; i<numClasses; i++) { 
     classList[i] = rightSide.classList[i]; 
    } 
} 
return *this; 
} 

//main function 
int main() { 
    char choice; 
do { 
// Test our code with two student classes 
Student s1, s2; 

s1.InputData();  // Input data for student 1 
cout << "Student 1's data:" << endl; 
s1.OutputData();  // Output data for student 1 

cout << endl; 

s2 = s1; 
cout << "Student 2's data after assignment from student 1:" << endl; 
s2.OutputData();  // Should output same data as for student 1 

s1.ResetClasses(); 
cout << "Student 1's data after reset:" << endl; 
s1.OutputData();  // Should have no classes 

cout << "Student 2's data, should still have original classes:" << endl; 
s2.OutputData();  // Should still have original classes 

cout << endl; 
cout << "Would you like to continue? y/n" << endl; 
cin >> choice; 
if(choice == 'y') { 

    void InputData();  // Input all data from user 
    void OutputData();  // Output class list to console 
    void ResetClasses();  // Reset class list 
} 
} while(choice == 'y'); 

return 0; 
} 
+0

Если вы сделаете список «vector », то вам больше не нужно его удалять или создать оператор присваивания или конструктор копирования (который вы забыли). Это просто работает. –

ответ

0

Просто избавиться от

if(choice == 'y') { 

    void InputData();  // Input all data from user 
    void OutputData();  // Output class list to console 
    void ResetClasses();  // Reset class list 
} 

Поскольку переменные s1 и s2 находятся внутри делать-то время цикла, они будут воссозданы на каждой итерации. (Конструктор будет вызываться в определении, и деструктор будет вызываться в закрывающей скобке цикла, прежде чем он проверит choice == 'y' и повторит).

Другая проблема, с которой вы столкнулись, заключается в том, что ваш стандартный вход не находится в состоянии, совместимом с вызовом s1.InputData(). Поскольку вы только что использовали оператор извлечения >> для чтения choice, синтаксический анализ остановился в первом пробеле, и в буфере есть (по крайней мере) новая строка. Когда Student::InputData звонит getline, он найдет, что новая строка все еще находится в буфере и не ждет дополнительного ввода.

По этой же причине вы использовали cin.ignore после прочтения numClasses. Вы захотите сделать то же самое здесь.

+0

Это не «переменные»; они являются декларациями функций. Скорее всего, OP намеревается вызывать функции с тем же именем из глобальной области, а не обновлять подобные локальные. Я не вижу, что удалит весь этот условный блок. –

+0

Да, это не поможет, потому что он перезапустит программу без повторного запроса пользователя. Я пробовал вызывать функции ввода и вывода разными способами без везения. Любые намеки или идеи? – NoobCoderChick

+0

@LightnessRacesinOrbit: Пожалуйста, оставьте свой комментарий. Это не переменные, но я никогда не говорил, что они были. Я сказал, что переменные ARE внутри цикла. Ну, они есть. Ваш комментарий полностью упустил точку. Если вы не видите, что будет делать удаление условного блока ... вы даже посмотрели на код в вопросе? –

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