繁体   English   中英

如何让我的 setfunction 通过我的 if 循环运行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM