我试图让这段代码用来计算盒子的表面积和体积。它编译但不输出正确的数据。我想也许问题是在void Box :: parts之内,但是已经碰壁了。或者它可能是Height = Height但是我无法以任何其他方式运行而没有错误。
以下是代码:
#include <iostream>
#include "Box.hpp"
using namespace std;
int main()
{
Box box;
double boxHeight, boxWidth, boxLength;
cout << "This program will tell you the surface area and volume of a box" << endl;
cout << "Please enter the height " << endl;
cin >> boxHeight;
cout << "Please enter the width " << endl;
cin >> boxWidth;
cout << "Please enter the length" << endl;
cin >> boxLength;
box.setHeight();
cout << "The surface area is " << box.getSurfaceArea() << endl;
cout << "The volume is " << box.getVolume() << endl;
return 0;
}
void Box::setHeight(){
if(Height< 0)
cout << "Error. Must enter a positive number " << endl;
else
Height = Height;
}
void Box::setLength(){
if(Length< 0)
cout << "Error. Must enter a positive number " << endl;
else
Length = Length;
}
void Box::setWidth(){
if(Width< 0)
cout << "Error. Must enter a positive number " << endl;
else
Width = Width;
}
double Box::getSurfaceArea(){
return 2*(Length*Width) + 2*(Length*Height) + 2*(Width + Height);
}
double Box::getVolume(){
return Length*Width*Height;
}
hpp文件是这样的:
#ifndef BOX_HPP_INCLUDED
#define BOX_HPP_INCLUDED
class Box
{
public:
void setHeight();
void setWidth();
void setLength();
double getVolume();
double getSurfaceArea();
private:
double Length;
double Width;
double Height;
};
#endif
答案 0 :(得分:2)
首先,您需要传递要在setter中设置的值:
void setHeight(double height);
void setWidth(double width);
void setLength(double length);
void Box::setHeight(double height)
{
if(height < 0)
cout << "Error. Must enter a positive number " << endl;
else
Height = height;
}
void Box::setWidth(double width)
{
if(width < 0)
cout << "Error. Must enter a positive number " << endl;
else
Width = width;
}
void Box::setLength(double length)
{
if(length < 0)
cout << "Error. Must enter a positive number " << endl;
else
Length = length;
}
此外,您不仅需要设置框的高度,还要设置宽度和长度:
box.setHeight(boxHeight);
box.setWidth(boxWidth);
box.setLength(boxLength);
这应该可以解决问题。
答案 1 :(得分:1)
box.setHeight();
想想你如何准确地告诉这个盒子设置它的高度。更具体地说,应该将其高度设置为。一般来说,你会告诉它:
box.setHeight (h);
其中h
是您要将其设置为的高度。这意味着将参数传递给看起来像这样的函数:
void Box::setHeight(double newH){
if(newH < 0)
cout << "Error. Must enter a positive number " << endl;
else
Height = newH; // assuming Height is a member variable.
}
}
目前你拥有它的方式:
Height = Height;
只需将高度保留为之前的任何值。
当然也适用于其他两个维度。
我想提到的另一件事是,一个类实际打印一些东西以表示问题是不寻常的,因为这通常是调用者应该决定的事情。您不希望应用程序输出被通用类输出信息搞砸。
最好返回错误代码或抛出异常并让调用者决定该怎么做。或者甚至可以默默地使用参数的绝对值,例如:
if (val < 0) val = -val;
Height = val;
虽然有人会认为这违反了最不惊讶的原则,但这实际上取决于你认为最好的行为。
在这种情况下可能没问题,因为立方体仍然具有相同的表面积和体积,无论它如何定向或位于太空中。
答案 2 :(得分:0)
问题是用户输入的值永远不能到达类的私有成员。您必须在方法setHeight
setWidth
中提供参数,才能实际设置私有成员Height
和Width
(长度也相似)。
在您当前的代码中,您没有提供构造函数,因此您实际上正在处理私有成员Height,Width和Length的垃圾值。
编辑:hpp文件的public
中的构造函数应如下所示:
Box()
{
Height=0;
Width=0;
Length=0;
}
答案 3 :(得分:0)
你的方法有一个问题,因为用户输入的值不能用于设置函数,所以你只是用垃圾来初始化维度,所以要么使用有争议的set函数,比如setHeight(int height),要么重构程序以便它不需要参数。
答案 4 :(得分:0)
问题是,您的set
功能没有设置任何内容:
0
,则他们什么都不做。您想告诉set
函数他们应该将值设置为。
例如,如果您想告诉&#34;将宽度设置为100&#34;,那么setWidth();
这样的调用中缺少一条重要的信息 - 它没有知道你想要将宽度设置为100。
为什么?
因为你没有告诉它。您想以某种方式将该信息传递给set
函数。并且函数参数就是这样的:
void setWidth(int NewWidth)
声明setWidth
接受int
作为参数。
现在您可以这样调用它:setWidth(100)
并且它会知道您要将宽度设置为100.或者您可以这样做:
int width;
cin >> width;
box.setWidth(width);
向用户询问width
的值。
然后现在唯一剩下的就是在函数体中使用该函数参数变量来检查NewWidth
是否低于零,否则,将NewWidth
分配给Width
。