如何在这种OOP情况下更新单个元素

how to update individual elements in this OOP case?

本文关键字:情况下 更新 单个 元素 OOP      更新时间:2023-10-16

我有这个"movie store.cpp"

#include "List.h"
#include <iomanip>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath> 
using namespace std;    
//****************************************************************************************************
const static char* FILE_NAME = "Movies.csv";
    int totalCheckedIn1 = 0;
    int totalCheckedOut1 = 0;    
//****************************************************************************************************    
struct Movie
{
    int MPAC;
    int year;
    int runtime;
    int checkedIn;
    int checkedOut;
    string title;
    Movie()
    {    
    }
    Movie(int m, int y, int r, int ci, int co, string t)  
    {
        MPAC = m; 
        year = y; 
        runtime = r;
        checkedIn = ci; 
        checkedOut = co; 
        title = t;
    }
    bool operator == (const Movie& rhs) const
    {
        return (MPAC == rhs.MPAC);
    }
    Movie& operator =(const Movie& rhs)
    {
        MPAC = rhs.MPAC;
        year = rhs.year;
        runtime = rhs.runtime;
        checkedIn = rhs.checkedIn;
        checkedOut = rhs.checkedOut;
        title = rhs.title;
        return *this;
    }    
    friend ostream& operator <<(ostream& os, const Movie& m);
};    
void setInventory(List<Movie> z, double f)
{   
}
    //****************************************************************************************************
ostream& operator<<(ostream& os, const Movie& m)
{
    os << setw(7) << left << m.MPAC
        << setw(25) << left << m.title
        << setw(7) << left << m.year
        << setw(10) << left << m.runtime
        << setw(7) << left << m.checkedIn
        << setw(7) << left << m.checkedOut;
    return os;
}    
//****************************************************************************************************
void getData(List<Movie>& Movies);
void displayList(List<Movie>& Movies);
void findMovies(List<Movie> Movies);
    //****************************************************************************************************
int main()
{
    List<Movie> WebsterMovies;
    getData(WebsterMovies);
    cout << "CHECK";    
    displayList(WebsterMovies);
//  findMovies(WebsterMovies);
    setInventory(WebsterMovies, 10.5);
    cout << "The following data is the updated Webster Movies storen";
    //displayList(WebsterMovies);       
    system("PAUSE");
    return 0;
}    
//****************************************************************************************************
void getData(List<Movie>& Movies)
{
    ifstream infile(FILE_NAME);
    if (!infile)
    {
        cout << "Problem opening file" << endl;
        exit(99);
    }
    while (!infile.eof())
    {
        Movie m;
        if (infile.peek() == EOF)
            break;
        infile >> m.MPAC;
        infile.ignore();
        infile >> m.year;
        infile.ignore();
        infile >> m.runtime;
        infile.ignore();
        infile >> m.checkedIn;
        infile.ignore();
        infile >> m.checkedOut;
        infile.ignore();
        getline(infile, m.title);
        Movies.insert(m);
    }
    infile.close();
}    
//****************************************************************************************************
void displayList(List<Movie>& Movies)
{
    int totalCheckedIn = 0;
    int totalCheckedOut = 0;
    cout << "The Webster Movie Store list includes : " << endl;
    cout << setw(7) << left << "MPAC"
        << setw(25) << left << "Title"
        << setw(7) << left << "Year"
        << setw(10) << left << "RunTime"
        << setw(7) << left << "In"
        << setw(7) << left << "Out" << endl;
    cout << "-------------------------------------------------------------------------------" << endl;
    double totalRunTime = 0;
    for (int i = 0, size = Movies.getNumber();
        i < size; ++i)
    {
        Movie m = Movies.getNext();
        cout << m << endl;
        totalRunTime += m.runtime;
        totalCheckedIn += m.checkedIn;
        totalCheckedOut += m.checkedOut;            
    }
    cout << "The average run time for the " << Movies.getNumber()
        << " movies is " << fixed << setprecision(1)
        << totalRunTime / Movies.getNumber() << endl;
    cout << "There are " << totalCheckedIn << " movies checked in " << endl;
    cout << "There are " << totalCheckedOut << " movies checked out" << endl;
    totalCheckedIn1 = totalCheckedIn;
}    
//****************************************************************************************************
void findMovies(List<Movie> Movies)
{
    while (true)
    {
        cout << "Enter the MPAC of a movie to locate:";
        int input;
        cin >> input;
        if (input == 0)
            break;
        Movie m;
        m.MPAC = input;
        if (Movies.getMember(m))
        {
            cout << setw(7) << left << "MPAC"
                << setw(25) << left << "Title"
                << setw(7) << left << "Year"
                << setw(10) << left << "RunTime"
                << setw(7) << left << "In"
                << setw(7) << left << "Out" << endl;
            cout << "-------------------------------------------------------------------------------" << endl;
            cout << m << endl;
        }
        else
        {
            cout << "That movie is not in the store" << endl;
        }
    }
}

这是"list.h"

#ifndef LIST_H
#define LIST_H
#include <iostream>    
//********************************************************************************
template <typename T>
class List
{
public:
    List();
    List(int size);
    List(const List &obj);
    ~List();
    void insert(T);
    T getNext();  // Returns the next element in the array.
    bool getMember(T&);  // Returns true if we can find the member, false otherwise.
    int getNumber();  // Returns the number of items in the list.
private:
    T *pList;
    int numberInList;  // Number of elements in the list.
    int listSize;  // Size of the list.
    int nextIndex;  // Index that points to the next element in the array.
};
//********************************************************************************
// Default Constructor
template <typename T>
List<T>::List()  
{
    numberInList = 0; 
    listSize = 100; 
    nextIndex = 0;
    pList = new T[listSize];
}
//********************************************************************************
// Overloaded Constructor
template <typename T>
List<T>::List(int size)  
{
    numberInList = 0; 
    listSize = size; 
    nextIndex = 0;
    pList = new T[listSize];
}
//********************************************************************************
// Copy Constructor
template <typename T>
List<T>::List(const List &obj) 
{
    numberInList = obj.numberInList;
    listSize = obj.listSize;
    nextIndex = obj.nextIndex;
    pList = new T[listSize];
    for (int i = 0; i < listSize; i++)
    {
        pList[i] = obj.pList[i];
    }
}
    //********************************************************************************
// Destructor
template <typename T>
    List<T>::~List()        
    {
        delete[]pList;
    }
//********************************************************************************
template <typename T>
void List<T>::insert(T item)
{
    int temp = numberInList++;
    pList[temp] = item;
}    
//********************************************************************************
template <typename T>
T List<T>::getNext()
{
    return pList[nextIndex++];
}
    //********************************************************************************
template <typename T>
bool List<T>::getMember(T& item)
{
    for (int i = 0; i < numberInList; ++i)
    {
        if (item == pList[i])
        {
            item = pList[i];
            return true;
        }
    }    
    return false;
}
    //********************************************************************************
template <typename T>
int List<T>::getNumber()
{
    return numberInList;
}
#endif

我的问题是setInventory函数需要使用公式(checkedIn + CheckedOut) * (f/100.0)更新每个列表元素的checkedIn成员。有人可以指导我如何使用此函数更新单个元素。为了更新List的每个元素,你需要修改模板来包含一个setItem函数,该函数将List对象中的相关元素设置为传递给setItem函数的项。提示:这个函数应该只包含一条c++语句。"

如果有人可以指导我如何更新单个元素的语法。这是我为setInventory()

写的东西
    void setInventory(List<Movie> WebsterMovies , double f)
    {
    Movie m = WebsterMovies.getNext();
    cout << m << endl;
    cout << "Check again" << endl << endl;
    int size = WebsterMovies.getNumber();
    int increment = 0;
    for (int i = 0 ; i < size; ++i)
    {   
        cout << m << endl;
        increment = trunc(((m.checkedIn + m.checkedOut) * f )/ 100);
        m.checkedIn = m.checkedIn + increment;
        cout << "updated checkin is : " << m.checkedIn << endl;
        WebsterMovies.setItem(m);
        Movie m = WebsterMovies.getNext();
    } 
}

this is setItem i written

 template <typename T>
    void List<T>::setItem(T item)
    {
        pList[numberInList] = item;
    }

p。我是新手,很抱歉我的英语不好,或者有其他错误。

要更新容器中的元素,例如std::list,您需要找到该元素,然后更新字段。

示例:

std::list<Movie> database;
// Search by title
std::list<Movie>::iterator iter;
const std::list<Movie>::iterator end_iter = database.end();
for (iter = database.begin();
     iter != end_iter;
     ++iter)
{
  if (iter->title == search_title)
  {
     Update_Movie(*iter);
  }
}