【问题标题】:how to update individual elements in this OOP case?在这种 OOP 案例中如何更新单个元素?
【发布时间】:2016-09-27 16:55:38
【问题描述】:

我有这个“电影商店.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 store\n";
    //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) 更新每个列表元素的 checkIn 成员。有人可以指导我如何使用此函数更新单个元素。帮助我说“为了更新列表的每个元素,您需要修改模板以包含一个 setItem 函数,该函数将列表对象中的关联元素设置为传递给 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();

    } 
}

这是我写的setItem

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

p.s 初学者在这里很抱歉英语不好或任何其他错误。

【问题讨论】:

  • Stack Overflow 并不是一种辅导服务。
  • 感谢您的意见。
  • @πάνταῥεῖ 据我所知,既不是辅导服务,也不是代码编写服务。 ;-)
  • @skypjack 当然。我指的是“如果有人可以指导我如何更新单个元素的语法”
  • 离题:这是一个几乎臭名昭著的常见错误:while (!infile.eof())。知道您是否已达到 eof 的唯一方法是已达到 eof。你不能在阅读之前测试 eof,你必须在阅读之后和使用你阅读的内容之前进行测试。更多信息:stackoverflow.com/questions/5605125/…

标签: c++ list oop templates


【解决方案1】:

要更新容器中的元素,例如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);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2019-05-24
    • 2015-04-10
    相关资源
    最近更新 更多