我正在尝试构建一个包含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()
{
}
答案 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构造函数上添加更多参数,也可以设置默认值。
由于变量nameOfSnack
,snackPrice
和numOfCalories
是其班级的私人成员,因此我们无法在班级Snack
之外更改其值。
在班级VendSlot
(或您创建班级实例的位置)中,您只能调用公共成员getNameOfSnack
,getSnackPrice
和getNumOfCalories
Snack
。
因此,暗示函数VendSlot::getSnack
返回零食的名称,该函数将如下所示。
string VendSlot::getSnack() {
return snack.getNameOfSnack();
}
我希望这能回答你的问题。