带有c ++类的C ++ Vending Machine程序

时间:2017-04-16 04:29:18

标签: c++

我正在尝试构建一个包含3个不同类的自动售货机程序,但我被困在第二部分。基本上第一类是零食类,它有3个参数(卡路里,名称和价格。)但是,第二类VendSlot,应该有两个成员,一个小吃(我认为是第一个文件中的对象)和零食数量。我真的很难理解如何处理第二类中的零食对象。我如何将第一个零食对象传递到我的VendSlot类中,以便我可以在VendSlot中增加/减少我的存储量,然后让用户在我到达第三个项目时购买它?我还不能使用指针,但可以通过引用传递,我想知道这是否是一种有效的方法?第三类将是一个自动售货机,将有vendSlots并将花钱购买物品。感谢您的帮助,如果您需要澄清该项目,请告诉我们!

这是我的Snack头文件

#ifndef SNACK_CPP
#include <string>
using std::string;

class Snack
{
private: 
    string nameOfSnack;
    double snackPrice;
    int numOfCalories;

public:
    Snack(); //default constructor
    Snack(string, double, int); //overload constructor
    ~Snack(); //destructor

    //Accessor functions

    string getNameOfSnack(); //returns name of snack
    double getSnackPrice(); //returns the price of the snack
    int getNumOfCalories(); //returns number of calories of snack
};



#endif // !SNACK_CPP

这是带有构造函数的snack.cpp文件

#include "Snack.hpp"
#include <iostream>
#include <string>

using std::endl;
using std::string;
using std::cout;
using std::cin;

Snack::Snack() //default constructor
{
    nameOfSnack = "bottled water";
    snackPrice = 1.75;
    numOfCalories = 0;
}

Snack::Snack(string name, double price, int cals)
{
    nameOfSnack = name; 
    snackPrice = price; 
    numOfCalories = cals; 

}

Snack::~Snack()
{

}

string Snack::getNameOfSnack()
{
    return nameOfSnack;
}

double Snack::getSnackPrice()
{
    return snackPrice;
}

int Snack::getNumOfCalories()
{
    return numOfCalories;
}

这是我的VendSlot头文件

#ifndef VENDSLOT_CPP
#include "Snack.h"
#include <string>

class VendSlot
{
public:
    VendSlot(); //default constructor
    VendSlot(string, double); //overload constructor
    string getSnack(); //get snack name
    int getAmount(); //get amount of snacks available
    void decrementAmount(int); //function to decrease storage in vending machine by 1.
    Snack snack; //passes snack object? I am confused what this should be.
   ~VendSlot(); //destructor 

private:

    double numOfSnacks; // number of snacks
};

#endif // !VENDSLOT_CPP

这是我正在努力的我的VendSlot.cpp文件

#include "VendSlot.h"
#include "Snack.h"
#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

VendSlot::VendSlot()
{
    snack;
    numOfSnacks = 5; 
}

VendSlot::VendSlot(string Snack, double Quantity)
{
    snack = Snack;
    numOfSnacks = Quantity;
}

int VendSlot::getAmount()
{
    return numOfSnacks;
}

string VendSlot::getSnack()
{
    return snack;
}


VendSlot::~VendSlot()
{
}

2 个答案:

答案 0 :(得分:0)

我不确定这是否是您的计划或作业的重点。我正在回答你的问题,当它包含在VendSlot类中时,Snack类如何获得它的构造函数参数。

另一个类中包含的成员从初始化列表中获取它们的构造函数参数。

以下是您如何完成此案例的示例:

Snack::Snack(string name, double price, int cals) :
    nameOfSnack(name), 
    snackPrice(price),
    numOfCalories(cals)   
{
}

VendSlot::VendSlot(Snack& snack, int quantity) :
    snack(snack),
    numOfSnacks(quantity)
{
}

另外,使用引用的注释是传递整个类或结构时通常使用的内容。这也意味着将使用编译器提供的默认Snack复制构造函数,除非您自己实现。如果类只有简单的本机类型它应该工作,但为了安全起见,你应该自己实现它。 会员quantity似乎最好是int类型,因为您不会出售零食。

这是你需要它定义的赋值运算符和复制构造函数。

Snack& Snack::operator=(const Snack& snack)
{
    this->nameOfSnack = snack.name;
    this->snackPrice = snack.price;
    this->numOfCalories = snack.cals;
}

Snack::Snack(const Snack& snack)
{
    *this = snack;
}

答案 1 :(得分:-1)

使用C ++编写类时,将它们想象为包含变量的变量。因此,使用它们与使用变量的方式相同。

当您调用类的实例(或&#34;声明变量&#34;)时,将调用构造函数。这样做有两种方法。有或没有参数:

Snack A("Chocolate", 12.5, 199);//This will call the constructor with parameters
Snack B;//This will call the constructor without parameters

所以现在我们有两个同一个类的对象。要使用对象的成员,我们只使用一段时间。

cout << A.getNameOfSnack() << endl;//Output: Chocolate
cout << B.getNameOfSnack() << endl;//Output: bottled water

另请注意,我们只能访问公众成员。

继续前进,创建一个类作为其他类成员的实例并没有什么不同。

class VendSlot {
public:
    Snack snack;
    int numOfSnacks;

    VendSlot();
    VendSlot(string, double);
    ~VendSlot();
};

VendSlot::VendSlot() {
    snack = Snack();//Call the constructor to create the object
    numOfSnacks = 5;
}

VendSlot::VendSlot(string nameSnack, double Quantity) {//Notice that I changed the name of the first parameter
    snack = Snack(nameSnack, 0, 0);//Call the constructor to create the object
    numOfSnacks = Quantity;
}

首先,您需要确保不使用类的名称作为变量的名称(这会给您带来错误,因此请小心)。现在,由于您在VendSlot构造函数中提供的唯一数据是零食的名称,因此没有更多信息作为参数发送到Snack的构造函数。您可以在VendSlot构造函数上添加更多参数,也可以设置默认值。

由于变量nameOfSnacksnackPricenumOfCalories是其班级的私人成员,因此我们无法在班级Snack之外更改其值。

在班级VendSlot(或您创建班级实例的位置)中,您只能调用公共成员getNameOfSnackgetSnackPricegetNumOfCalories Snack

因此,暗示函数VendSlot::getSnack返回零食的名称,该函数将如下所示。

string VendSlot::getSnack() {
    return snack.getNameOfSnack();
}

我希望这能回答你的问题。