[英]How do I make my setfunction run through my if loop?
我正在研究一个程序,我需要制作一个关于汽车的 class。 我需要添加仅允许 1930 -2030 的汽车制造年份作为输入的 setFunctions,其他任何内容都将自动设置为 2012。我的代码如下所示:
// code will be following
void setYear(int yr)
{
if (yr > 2030 || yr < 1930){
yr = 2012;
}
else {
year = yr;
}
}
// end of segment.
我也有 setSpeed 的代码,它不能小于 0,如下所示
// code following
void setSpeed(int spd)
{
if (spd < 0){
spd = 0;
}
else {
speed = spd;
}
}
问题是,当我尝试更改对象的变量时,set 函数无法按预期工作。 我相信问题出在我的构造函数上,
// constructor with default parameters
car(int yr = 2012, string mk = "unknown", int spd = 0)
{
year = yr;
make = mk;
speed = 0;
}
我的代码基本上是按要求做项目的,只是不完全是要求的。
这是我的代码应该做的:
创建一个程序来说明 C++ 个类。 您的程序应该执行以下操作:
写一个名为 Car 的 class 有如下成员变量:
年(一个 int,它包含汽车的 model 年。年份必须在 1900-2030(含)之间)。
make(保存汽车品牌的字符串。)
速度(一个保存汽车当前速度的整数。速度必须为 0 或更大。)此外,class 应具有以下成员函数:
构造函数 - 构造函数应接受汽车的年份并将其设为 arguments 并将这些值分配给对象的年份并生成成员变量。 构造函数应将 speed 成员变量初始化为 0。请注意,此构造函数将有 2 个参数:一个代表年份,一个代表汽车品牌。
当您定义一个 Car object 时,您需要发送构造函数期望的两个 arguments:
Car myCar(2002, "捷达");
在构造函数中,您需要为每个成员变量赋值:
- 由于年份具有允许的特定值,请使用发送的值调用 setYear function。
- 将 make 设置为传递的值。
- 将速度设置为零。 您可以使用简单的赋值语句来完成此操作,也可以调用 setSpeed function。
获取函数:
应创建适当的访问函数以允许从对象的年份、品牌和速度成员变量中检索值。 将有三个 get 函数,每个成员变量一个。 这些函数中的每一个都返回一个东西并且没有参数。设置功能:
将有三个集合函数,每个成员变量一个。 这些函数中的每一个都接收一个东西并且什么都不返回。
- 速度不能小于零。 让您的设置 function 保护速度,使其永远不会为负。 如果发送负值,只需将速度设置为零。
- 年份必须介于 1900 年和 2030 年之间(含)。 如果发送的年份超出范围,则将年份设置为 2012 年。无需验证品牌。
加速:
accelerate function每次调用都要给speed成员变量加5。 这个成员 function 什么都不返回,也没有参数。 它只是完成它的工作:每次调用它时,它都会增加 5 的速度。制动:
brake function每次调用都要将speed成员变量减5。 如果速度已经为零,则不改变速度。 这个成员 function 什么都不返回,也没有参数。 它只是完成它的工作:每次调用它时,它都会从速度中减去 5,除非速度已经为零。 然后它没有改变。笔记:
在创建汽车 object 的程序中演示 class,然后调用加速器 function 五次。 每次调用加速function后,获取小车当前速度并显示。然后,七次拨打刹车function。 每次调用刹车function后,获取汽车当前速度并显示。 每次显示速度时,请在 output label 中包含车辆的年份和品牌。
现在,将年份、品牌和速度分别设置为 2009、Jeep 和 75。 再次拨打加速function五次。 每次调用加速function后,获取小车当前速度并显示。 然后,七次拨打刹车function。 每次调用刹车function后,获取汽车当前速度并显示。 每次显示速度时,请在 output label 中包含车辆的年份和品牌。
最后,将年份、品牌和速度分别设置为 1827、Jetta 和 -30。 使用 get 函数,打印出年份、品牌和速度。
这是我的代码:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
// car class declaration
class car
{
private:
int year;
string make;
int speed;
public:
//creation of set functions
void setYear(int yr)
{
if (yr > 2030 || yr < 1930){
yr = 2012;
}
else {
year = yr;
}
}
void setMake(string mk) {
make = mk;
}
void setSpeed(int spd)
{
if (spd < 0){
spd = 0;
}
else {
speed = spd;
}
}
// constructor with default parameters
car(int yr = 2012, string mk = "unknown", int spd = 0)
{
year = yr;
make = mk;
speed = 0;
}
// Accessors ( The get functions)
int getYear()
{ return year; }
string getMake()
{ return make; }
int getSpeed()
{ return speed; }
// Mutators
void accelerate ()
{ speed += 5; }
void brake()
{
if ( speed >= 5)
speed -=5;
else
speed = 0;
}
};
int main()
{
// creation and display of first object of car class
car hotRod (2020, "Ford");
hotRod.setSpeed(40);
cout << "I've spotted a " << hotRod.getYear()<<" "
<< hotRod.getMake() << " car, going 40 kmph!\n\n";
// accelerator function to run 5 times
cout << "It is accelerating \n\n";
for (int run =0; run < 5; run++)
{
hotRod.accelerate();
cout << hotRod.getYear()<<" " << hotRod.getMake()
<< " current speed: " << hotRod.getSpeed() << "kmph.\n";
}
cout << endl;
// breaking function to run 7 times
cout << "Now it's 'breaking... " << endl;
for(int brk = 0; brk < 7; brk++)
{
hotRod.brake();
cout << hotRod.getYear()<<" "<< hotRod.getMake()
<< " Current speed: " << hotRod.getSpeed() << "kmph.\n";
}
// intermediary input to break the program apart
// this allows for better display of program
string x;
cout << endl << endl << endl << "Would you like to know what car I saw next? ";
cin >> x;
// creation and display of second object in car class
car hotRod2 (2009, "Jeep");
hotRod2.setSpeed(75);
cout << endl << endl <<endl
<< "I've spotted a " << hotRod2.getYear()<<" "
<< hotRod2.getMake() << " car, going 75kmph!\n\n";
// accelerator function to run 5 times
cout << "It is accelerating \n\n";
for (int run =0; run < 5; run++)
{
hotRod2.accelerate();
cout << hotRod2.getYear()<<" " << hotRod2.getMake()
<< " current speed: " << hotRod2.getSpeed() << "kmph.\n";
}
cout << endl;
// Breaking function to run 7 times
cout << "Now it's 'breaking... " << endl;
for(int brk = 0; brk < 7; brk++)
{
hotRod2.brake();
cout << hotRod2.getYear()<<" "<< hotRod2.getMake()
<< " Current speed: " << hotRod2.getSpeed() << "kmph.\n";
}
string y;
cout << endl << endl << endl << "Would you like to know what car I saw next? ";
cin >> y;
// creation of 3rd object of car class
car hotRod3;
hotRod3.setMake("Jetta");
hotRod3.setYear(1827);
hotRod3.setSpeed(-30);
cout << endl << endl <<endl
<< "I've spotted a "
<<hotRod3.getYear()
<<" "
<< hotRod3.getMake() << " car, going "
<< hotRod3.getSpeed()
<< "kmph! \n\n";
// end of program
return 0;
}
setYear()
和setSpeed()
都犯了同样的错误。 如果输入值超出范围,它们不会为 class 数据成员分配任何值。
试试这个:
void setYear(int yr)
{
if (yr > 2030 || yr < 1930){
yr = 2012;
}
year = yr;
}
void setSpeed(int spd)
{
if (spd < 0){
spd = 0;
}
speed = spd;
}
此外,您的构造函数应该调用set...
函数,否则创建者可以按原样传递不可接受的值:
car(int yr = 2012, string mk = "unknown", int spd = 0)
{
setYear(yr);
setMake(mk);
setSpeed(spd);
}
事实上,说明明确告诉你要做到这一点:
在构造函数中,您需要为每个成员变量赋值:
- 由于年份具有允许的特定值,请使用发送的值调用 setYear function 。
- 将 make 设置为传递的值。
- 将速度设置为零。 您可以使用简单的赋值语句来执行此操作,也可以调用 setSpeed function 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.