This is the source file containing the main function to test our Movie class.
/* There are no test cases for this example as it is simply a demonstration of using classes At the point at which updated ratings are prompted for, one could potentially try different test cases */ #include <iostream> #include <vector> #include "Movie.h" // This is how our program knows what a Movie object is using namespace std; /* Function to print a list of movies to the console @param movies list of movies to print */ void print_movies(const vector<Movie> & movies) { for (int i = 0; i < movies.size(); i++) { // Note that the to_string() function of the Movie class must be const // otherwise we cannot guarantee that the function parameter will be unchanged // by the function, as indicated by the const above cout << movies[i].to_string() << endl; } } int main() { // This program simulates the creation of movie objects purely to demonstrate how classes and objects are used // Create a new Movie object using a constructor that takes a title, a duration, and a rating Movie favorite_movie("Jurassic Park 4",2.5,4.5); // Here are two accessor functions that allow us to access // (but not modify) data memembers of objects of the Movie class cout << "Favorite movie is " << favorite_movie.get_title() << endl; cout << "It's rating is " << favorite_movie.get_my_rating() << endl; // Here is a mutator function to allow us to change the value of a data favorite_movie.update_my_rating(4.9); // Check that the value has actually changed cout << "It's new rating is " << favorite_movie.get_my_rating() << endl << endl; // It is always good to have a to_string function that returns a string representation of the object cout << favorite_movie.to_string() << endl << endl; // We can create multiple objects of the same class Movie worst_movie("The Last Airbender", 2.0, 0.1); cout << worst_movie.to_string() << endl; // We can create a vector of objects of a particular class vector<Movie> movies(10); movies[0] = Movie("Shrek", 1.8, 5.0); movies[1] = Movie("Count of Monte Cristo", 2.3, 4.9); movies[2] = Movie("Vertigo", 1.9, 4.5); movies[3] = Movie("Airplane", 1.7, 4.9); movies[4] = Movie("The Village", 1.6, 1.4); movies[5] = Movie("Eragon", 1.6, .3); movies[6] = Movie("Teenage Mutant Ninja Turtles", 1.4, .6); movies[7] = Movie("Man of Steel", 1.6, 3.6); movies[8] = Movie("The Majestic", 2.3, 4.85); movies[9] = Movie("Duck Soup", 1.6, 4.78); // This is a static function, in contrast to // the member functions called (via dot-notation) on an object print_movies(movies); // Prompt for a new rating for each of our movies for (int i = 0; i < movies.size(); i++) { cout << movies[i].get_title() << " has current rating " << movies[i].get_my_rating() << endl; cout << "New rating: "; double new_rating; cin >> new_rating; movies[i].update_my_rating(new_rating); } // Use the same static function to view movies with updated ratings print_movies(movies); system("pause"); return 0; }
#include <string> using namespace std; // These lines make it so that if a header is circuitously included twice // then the class is defined only once #ifndef _MOVIE_H #define _MOVIE_H // class names should be capitalized and camel-case class Movie { public: // CONSTRUCTORS /* Default constructor (called when no arguments are given) */ Movie(); /* Constructor to create new movie with specified title, duration and rating @param _title the title that should be assigned to the newly created Movie object @param _duration the duration of the newly created Movie object @param _my_rating the rating to initially assign to the newly created Movie object */ Movie(string _title, double _duration, double _my_rating); // MEMBER FUNCTIONS // Accessors /* Getter for the title of this Movie object @return title of this Movie object */ string get_title() const; // const means this function won't change the data members /* Getter for the duration of this Movie object @return duration of this Movie object */ double get_duration() const; /* Getter for my rating of this Movie object @return my rating of this Movie object */ double get_my_rating() const; // Mutators /* Assigns a new value to my rating for this Movie object @param new_rating the rating to assign to this Movie object */ void update_my_rating(double new_rating); /* Returns a string representation of this Movie object @return string representation of this Movie object */ string to_string() const; private: // DATA MEMBERS string title; double duration; double my_rating; }; #endif
Usually, it is only the member functions that need implementing in the .cpp file.
#include <sstream> // We have to include the class definition in order to know what we are implementing #include "Movie.h" // Don't forget to specify which class we are defining implementations for with "ClassName::" Movie::Movie() { title = ""; duration = 0.0; my_rating = 0.0; } Movie::Movie(string _title, double _duration, double _my_rating) { title = _title; duration = _duration; my_rating = _my_rating; } string Movie::get_title() const { return title; } double Movie::get_my_rating() const { return my_rating; } void Movie::update_my_rating(double new_rating) { my_rating = new_rating; } string Movie::to_string() const { ostringstream strm; strm << "Title: " << title << "\n"; strm << "Duration: " << duration << "\n"; strm << "My rating: " << my_rating << "\n"; return strm.str(); }