2015-02-23 3 views
1

Я работаю над программой, которая вычисляет объем окна, используя классы, чтобы помочь мне понять, как использовать классы. В рамках программы я хочу преобразовать объекты, длину и ширину объектов в строку, чтобы отобразить размеры окна. Когда я запускаю код из моего основного файла, он сбой. Когда я запускаю его из файла класса я получаю сообщение «не удалось преобразовать Box :: длину от двойной STD :: строка. Как я могу исправить ошибку преобразования?Не удалось преобразовать double в строку

#include <iostream> 
#include <stdexcept> 
#include <sstream> 
#include <iomanip> 
#include <string> 

using namespace std; 

class Box 
{ 
    public: 
     double length;//length of the box 
     double height;//height of the box 
     double width;//with of the box 

     Box(): length(1), height(1), width(1){} 

     //Parameterized Constructor 
     Box(double length, double width, double height); 


     double getVolume(void); 

     //Mutators 
     void setLength(double leng); 
     void setWidth(double wid); 
     void setHeight(double hei); 
     //Acessors 
     string toString() const; 
     string getLength(); 
     string getWidth(); 
     string getHeight(); 
};//end class 

//member function definitions 

    double Box::getVolume(void)//get volume will cal and output the volume when called 
    { 
     return length * width * height; 
    } 
    void Box::setLength(double leng) 
    { 
     const double MIN_LENGTH = 0.1;//constants for min/max for range check and out_of_range exception 
     const double MAX_LENGTH = 99; 
     if (length > MAX_LENGTH || length < MIN_LENGTH) 
     { 
      stringstream strOut;//declare string stream 

      strOut << "Length is out of range. Length must be between" << MIN_LENGTH << " and " << MAX_LENGTH << ".";//error msg 
      throw out_of_range(strOut.str()); 
     } 
     else 
     { 
      length = leng;// if length is within range, store it 
     } 
    } 
    string Box::getLength() 
    { 
     return length; 
    } 
    void Box::setWidth(double wid) 
    { 
     const double MIN_WIDTH = 0.1;//constants for min/max for range check and out_of_range exception 
     const double MAX_WIDTH = 99; 
     if (length > MAX_WIDTH || length < MIN_WIDTH) 
     { 
      stringstream strOut;//declare string stream 

      strOut << "Width is out of range. Width must be between" << MIN_WIDTH << " and " << MAX_WIDTH << ".";//error msg 
      throw out_of_range(strOut.str()); 
     } 
     else 
     { 
      width = wid;// width is in range, store it 
     } 
    } 

    string Box::getWidth() 
    { 
     return width; 
    } 
    void Box::setHeight(double hei) 
    { 
     const double MIN_HEIGHT = 0.1;//constants for min/max for range check and out_of_range exception 
     const double MAX_HEIGHT = 99; 
     if (length > MAX_HEIGHT || length < MIN_HEIGHT) 
     { 
      stringstream strOut;//declare string stream 

      strOut << "Height is out of range. Height must be between" << MIN_HEIGHT << " and " << MAX_HEIGHT << ".";//error msg 
      throw out_of_range(strOut.str()); 
     } 
     else 
     { 
      height = hei;// height is in range, store it 
     } 
    } 
    string Box::getHeight() 
    { 
     return height; 
    } 
    string Box::toString() const 
    { 
     stringstream strOut; 
     strOut << "Length: " << getLength() << endl 
     << "Width: " << getWidth() << endl << 
     "Height: " << getHeight() << endl; 
     return strOut; 
    } 
+0

что? это бессмысленно. Вы не можете запустить код из файла класса. «не удалось преобразовать Box :: length из double в std :: string», возможно, не будет сообщением об ошибке при запуске. Похоже на ошибку компилятора типа mismatch, которая говорит что-то вроде «не может преобразовать Box :: length из double в std :: string». – thang

+0

did not mean run, означало компиляцию, чтобы увидеть, что ошибок не было – Ryan

+0

Не выводить ошибку в строку, где значение будет 'strOut <<" Height is out ... ... ". Для этого нужны исключения. –

ответ

0

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

Вы можете использовать функцию to_string() в библиотеке строк и измените ваш getLength() на

return to_string(length) 
+1

Я изменил операторы return, должен ли я также изменять оригинальные объявления, потому что он говорит: «to_string не была объявлена ​​в этой области». – Ryan

+0

вы должны вставить #include наверху, так как to_string находится в строковой библиотеке –

+0

Также, немного советов: для справки в будущем getWidth() должен возвращать double, так как ширина double. Наличие некоторой последовательности в вашем коде является хорошей практикой. Вы должны либо определить новую функцию, getWidthAsString(), чтобы вернуть строку, либо, в своей основной функции, использовать to_string для преобразования возвращаемого значения getWidth() в строку. –

1

Этот компилятор ошибка возникает в операциях return ваших функций getWidth, getHeight, getLength. Это потому, что вы объявили, что они возвращают строку, но вместо этого возвращают ширину, высоту и длину, которые являются двойными. Компилятор видит, что нет автоматического преобразования из double в строку.

Чтобы это исправить, нужно только зафиксировать тип возвращаемого значения функции из строки в два раза:

double getLength(); 
double getWidth(); 
double getHeight(); 

Я заметил еще одна ошибка:

doubletostring.cpp:104:25: error: reference to non-static member function must be called 
strOut << "Length: " << getLength << endl 

И подобные ошибки в методе ToString , Просто преобразуйте их в вызовы функций, добавив () в конец:

strOut << "Length: " << getLength() << endl 
+0

Я изменил объявления функций на строку getWidth(); и т. д. все еще дает «не удалось преобразовать» – Ryan

+0

. При ближайшем рассмотрении на самом деле есть куча небольших ошибок. Например, stringstream отличается от строки, поэтому toString должен возвращать 'strOut.str()'. Также все ваши функции getter, включая getVolume(), должны быть const. Я просто компилировал и запускал код таким образом. – Alejandro

+0

Также вы изменили как объявление функции, так и определение функции на тот же тип возврата? Как и в, верхняя часть файла имеет 'double getWidth();' и позже 'double Box :: getWidth() {return width}'. Они должны соответствовать. – Alejandro