I am currently learning C++ and I've encountered a problem with classes that I cannot seem to be able to find a solution to. If ever there is a specific topic I should cover that will teach me how to do it let me know but if it's a mistake I made I would like help solving it please.
I have a console application that when run asks you to input the name of a movie, the year it was released and it's rating. The code asks you the same questions for 3 movies and then prints the results. It's just a code I made while following tutorials so it has no real purpose.
I made a class called "Movie" which hold the user's answers and a function to create the instance but it doesn't seem to work. I will paste the code with examples to make it easier to explain.
Movie.h
#ifndef MOVIE_H
#define MOVIE_H
#include <iostream>
#include <string>
using namespace std;
class Movie
{
private:
string movieName, movieRating;
int movieYear;
public:
Movie();
Movie(string, int, string);
virtual ~Movie();
string getName();
string getRating();
int getYear();
void setName(string);
void setRating(string);
void setYear(int);
protected:
};
#endif // MOVIE_H
Movie.cpp
#include "Movie.h"
#include <iostream>
#include <string>
#include <ctime>
using namespace std;
Movie::Movie()
{
movieName = "NA";
movieYear = 1999;
movieRating = "NA";
}
Movie::Movie(string name, int year, string rating)
{
movieName = name;
time_t t = time(0); // get time now
struct tm * now = localtime( & t );
int x = (now->tm_year + 1900);
while(year > x || year < 1889)
{
cout<<"Please enter a valid year: ";
cin>>year;
}
movieYear = year;
movieRating = rating;
}
Movie::~Movie()
{
}
string Movie::getName()
{
return movieName;
}
string Movie::getRating()
{
return movieRating;
}
int Movie::getYear()
{
return movieYear;
}
void Movie::setName(string n)
{
movieName = n;
}
void Movie::setRating(string r)
{
movieRating = r;
}
void Movie::setYear(int y)
{
time_t t = time(0); // get time now
struct tm * now = localtime( & t );
int x = (now->tm_year + 1900);
while(y > x || y < 1889)
{
cout<<"Please enter a valid year: ";
cin>>y;
}
movieYear = y;
}
main.cpp
#include <iostream>
#include <string>
#include "Movie.h"
using namespace std;
void newMovie(Movie);
void printMovies(Movie);
int main()
{
Movie movie1("a", 1900, "a");
Movie movie2("a", 1900, "a");
Movie movie3("a", 1900, "a");
newMovie(movie1);
//newMovie(movie2);
//newMovie(movie3);
printMovies(movie1);
//printMovies(movie2);
//printMovies(movie3);
return 0;
}
void newMovie(Movie movie)
{
string inName, inRating;
int inYear;
cout<<"Enter a movie name: ";
cin>>inName;
movie.setName(inName);
cout<<"Enter the year it was released: ";
cin>>inYear;
movie.setYear(inYear);
cout<<"Enter the suggested rating: ";
cin>>inRating;
movie.setRating(inRating);
cout<<endl<<endl;
}
void printMovies(Movie movie)
{
cout<<"Name: "<<movie.getName()
<<"\nYear: "<<movie.getYear()
<<"\nRating: "<<movie.getRating()
<<endl<<endl;
}
Now what happens when i run this is that the movie gets printed like this:
Enter a movie name: test Enter the year it was released: 2001 Enter the suggested rating: PG Name: a Year: 1900 Rating: a Process returned 0 (0x0) execution time : 6.912 s Press any key to continue.
It seems like the change made in newMovie(Movie movie) does not stay. If i do a print in the middle of it by doing something like this:
void newMovie(Movie movie)
{
string inName, inRating;
int inYear;
cout<<"Enter a movie name: ";
cin>>inName;
movie.setName(inName);
cout<<"Enter the year it was released: ";
cin>>inYear;
movie.setYear(inYear);
cout<<"Enter the suggested rating: ";
cin>>inRating;
movie.setRating(inRating);
cout<<endl<<endl;
cout<<movie.getName();
}
I do obtain the right name when printing which means that the class works fine. The only works inside the function as if it was private and I can't figure out why.