2015-02-08 4 views
0

Я пытаюсь заставить этот код работать, чтобы вычислить площадь поверхности и объем коробки. Он компилирует, но не выводит правильные данные. Я думаю, может быть, проблема находится в пределах void Box :: parts, но попала в стену. Или это может быть высота = высота, но я не мог заставить ее работать без ошибок любым другим способом.Площадь поверхности/том

Вот код:

#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 
+1

Как вы думаете, что ваши методы 'set' будут правильно устанавливать что-либо, если вы не предоставите значение для их установки? Например, 'setHeight()': что вызовет этот вызов, чтобы установить высоту? – emlai

+0

В качестве побочного примечания в вашей 'getSurfaceArea' есть небольшая ошибка. – emlai

+0

Вы сделали ту же ошибку [за неделю до] (http://stackoverflow.com/q/28257307/560648) ... –

ответ

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

Прежде всего, вам нужно передать значения, которые вы хотите установить в вашем сеттеров:

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); 

Это должно сделать трюк.

+0

Все три из ваших условий 'if' неверны. Вы должны проверить аргумент на безотвативность. –

+0

@Akshay Спасибо за редактирование, я не видел. –

0

Проблема заключается в том, что введенные пользователем значения никогда не могут попасть в частные члены класса.Вы должны указать аргумент в своих методах setHeightsetWidth, чтобы фактически установить частные члены Height и Width (и аналогичные по длине тоже).

В вашем текущем коде вы не предоставляете конструктор, поэтому на самом деле вы имеете дело с значениями мусора частных членов Height, Width и Length.

Edit: Ваш конструктор в public ХПП файл должен выглядеть следующим образом:

Box() 
{ 
Height=0; 
Width=0; 
Length=0; 
} 
+0

поэтому я должен добавить Box() в публикацию hpp-файла? – cppfan

+0

Да. В идеале вы должны создать свой ящик после ввода измерений с помощью конструктора (с высотой, шириной и длиной в качестве параметров) и инициализировать свои члены данных внутри этого конструктора. –

+0

Да. Будет хорошей идеей добавить конструктор для инициализации всех членов данных до нуля. Таким образом, даже если вы случайно используете их, не предоставляя им значения в вашем коде, вы фактически не используете значения мусора. –

0

Существует проблема в Вашем подходе, поскольку значение, введенное пользователем, не доступны для установки функции, так просто вы инициализация размер с мусором, поэтому либо используйте аргументированную функцию набора, например setHeight (int height), либо реструктурируйте программу, чтобы она не требовала аргумента.

0

Проблема заключается в том, ваши set функция ничего не установлена:

  • Если соответствующие их переменная член ниже 0, они ничего не делают.
  • Иначе они присваивают свою соответствующую переменную-члену себе самому, иначе ничего не делают.

Вы хотите сказать set функции , что они должны установить их значение.

Например, если вы хотите сказать «установить ширину до 100», есть важная информация отсутствует в вызове, как setWidth(); - Он не знает, что вы хотите, чтобы установить ширину до 100.

Почему?

Потому что вы этого не говорили. Вы хотите передать эту информацию своим функциям set. И функциональные параметры есть для этого:

void setWidth(int NewWidth)setWidth объявляет, чтобы принять int в качестве параметра.

Теперь вы можете называть это следующим образом: setWidth(100) и он будет знать, что вы хотите, чтобы установить ширину до 100. Или же вы можете сделать:

int width; 
cin >> width; 
box.setWidth(width); 

задать значение для width от пользователя.


Тогда единственное, что осталось для вас сейчас использовать этот переменные параметры функции в вашем теле функции, чтобы проверить, если NewWidth ниже нуля, либо назначьте NewWidth к Width.

+0

id скорее попросит пользователя ввести его для упрощения работы. любой наконечник для фиксации этого? – cppfan

+0

@cppfan Переменные могут использоваться для выполнения этого: 'int height; cin >> height; setHeight (height); ' – emlai

+0

@cppfan Добавил это к моему ответу. – emlai

Смежные вопросы