2016-07-30 9 views
-2

verwende. Also bin ich relativ neu in C++ und ich machte ein kleines Projekt, wo ich den Filmtitel, die Bewertung und das Jahr eingeben. Für den ersten Durchlauf läuft das Programm gut. Nachdem der Benutzer die gewünschte Information eingegeben hat, drucke ich ihn ohne Probleme auf den Bildschirm zurück. Wenn ich jedoch ein zweites Filmobjekt erstelle, das während des gleichen Laufs dasselbe tut, überspringt es den Abschnitt, in dem nach dem Titel gefragt wird, und springt direkt zur Bewertung. Irgendwelche Ideen? Es ist wahrscheinlich ein Noob-Fehler. Mein Code ist unten.Nach dem Erstellen des zweiten Objekts fragt das Konstruktorprogramm nicht, was ich getline für

MovieProject.cpp

#include "stdafx.h" 
#include "Movie.h" 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    Movie starwars; 
    starwars.MovieTeller(starwars); 
    Movie FerrisBueller; 
    FerrisBueller.MovieTeller(FerrisBueller); 
    Movie TheFoxandTheHound; 
    TheFoxandTheHound.MovieTeller(TheFoxandTheHound); 
    return 0; 
} 

Movie.cpp

#include "stdafx.h" 
    #include "Movie.h" 
    #include <string> 
    #include <iostream> 

using namespace std; 

Movie::Movie() 
{ 
    cout << "What is the title of your movie:"; 
    getline(cin,Title); 
    cout << "What is the Rating:"; 
    getline(cin,Rating); 
    cout << "What year was it made:"; 
    cin >> Year; 
    cout << "\n" << endl; 
    if (Year > 2016) { 
     cout << "Comon Dude stop messing around" << endl; 
     exit(404); 
    } 
} 

void Movie::MovieTeller(Movie a) { 
    cout << "Title:" << Title << "\n" << "Rating:" << Rating << "\n" << "Year:" << Year << "\n" << endl; 
} 
Movie::~Movie() 
{ 
} 

Movie.h

#pragma once 
#include <iostream> 
using namespace std; 
class Movie 
{ 
public: 
    Movie(); 
    ~Movie(); 
    void MovieTeller(Movie a); 
private: 
    string Title; 
    string Rating; 
    int Year; 
}; 
+0

Die Eingabe von 'Konstruktor' ist schlecht. Wenn Sie ein 'Array' mit 1000 Elementen erstellen möchten, müssen Sie 1000 Mal Eingaben machen. – LibertyPaul

+1

Sie mischen 'getline' und' >> '. – melpomene

+0

Höchstwahrscheinlich ist immer noch etwas im Eingabepuffer der vorherigen Iteration. –

Antwort

1

Dies geschieht die ganze Zeit, wenn Sie getline nach einer Lese einer Zahl verwenden, um mit >> Betreiber.

Hier ist was passiert: die cal cin >> Year liest alle Ziffern aus der Benutzereingabe, aber hinterlässt die \n an Ort und Stelle, weil es nicht Teil der Nummer ist. Wenn getline in einem Konstruktor des nächsten Objekts aufgerufen wird, ist die \n immer noch da, also getline zählt diese Eingabe als eine leere Zeile.

Sie können dies beheben, indem Sie nach dem Lesen des Jahres getline hinzufügen und das Ergebnis ignorieren. Ein besserer Ansatz wäre jedoch, die Eingabe aus dem Konstruktor vollständig zu entfernen und sie in einen benutzerdefinierten Eingabeoperator für Ihre Klasse zu verschieben. Auf diese Weise wäre Ihr Code viel sauberer.

+0

Dafür brauchen wir einen kanonischen Betrogenen. Krank, die gleichen Fragen und Antworten fünf Mal am Tag zu sehen! Wetten, du hast es satt, es auch zu schreiben. –

+0

@LightnessRacesinOrbit Ich stimme zu - das ist ein häufiges Problem, aber es ist sehr schwierig, nach SO zu suchen, weil es sich anders darstellt. Ich schrieb dies als Antwort (im Gegensatz zu einem Kommentar) für den letzten Absatz, um die Codeorganisation von OP zu korrigieren, was für mich ein schwerwiegenderer Fehler ist. – dasblinkenlight

+0

Nun, es sollte kein Kommentar sein –

0

Es gibt auch ein anderes Problem mit dem Code: Die Methode MovieTeller wirkt nicht auf die Instanz, die als Argument an diese Methode übergeben wurde. Es sollte

sein.
void Movie::MovieTeller(Movie a) { 
    cout << "Title:" << a.Title << "\n" << "Rating:" << a.Rating << "\n" << "Year:" << a.Year << "\n" << endl; 
} 

OR Diese Methode sollte als öffentliche Methode ohne Eingabeargumente deklariert werden.