Не удалось преобразовать double в строку

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

#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;
    }

person Ryan    schedule 23.02.2015    source источник
comment
какие? это бессмысленно. Вы не можете запустить код из файла класса. не удалось преобразовать Box::length из double в std::string не может быть сообщением об ошибке при запуске. Похоже на ошибку компилятора несоответствия типов, которая говорит о том, что невозможно преобразовать Box::length из double в std::string.   -  person thang    schedule 23.02.2015
comment
не имел в виду запуск, имел в виду компиляцию, чтобы убедиться, что ошибок нет   -  person Ryan    schedule 23.02.2015
comment
Не выводить ошибку в строку, где значение будет strOut << "Height is out of...". Вот для чего нужны исключения.   -  person Cole Johnson    schedule 23.02.2015


Ответы (2)


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

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

return to_string(length)
person Darvish Kamalia    schedule 23.02.2015
comment
Я изменил операторы возврата, должен ли я также изменить исходные объявления, потому что он говорит, что to_string не был объявлен в этой области. - person Ryan; 23.02.2015
comment
вы должны вставить #include ‹string› вверху, так как to_string находится в библиотеке строк - person Darvish Kamalia; 23.02.2015
comment
Кроме того, небольшой совет: для дальнейшего использования getWidth() должен возвращать двойное значение, так как ширина двойная. Наличие некоторой последовательности в вашем коде является хорошей практикой. Вы должны либо определить новую функцию getWidthAsString() для возврата строки, либо в самой основной функции использовать to_string для преобразования возвращаемого значения getWidth() в строку. - person Darvish Kamalia; 23.02.2015
comment
Подожди, неважно. Вы можете исправить свою ошибку, скомпилировав с параметром -std=c++11, поскольку to_string не был доступен до C++11. - person Darvish Kamalia; 23.02.2015

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

Чтобы исправить это, вам нужно всего лишь исправить возвращаемый тип функции со строки на 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
person Alejandro    schedule 23.02.2015
comment
Я изменил объявления функций на string getWidth(); и т. д. по-прежнему дает не удалось преобразовать - person Ryan; 23.02.2015
comment
При ближайшем рассмотрении на самом деле есть куча мелких ошибок. Например, stringstream отличается от string, поэтому toString должен возвращать strOut.str(). Также все ваши геттер-функции, включая getVolume(), должны быть константными. Я просто скомпилировал и запустил код таким образом. - person Alejandro; 23.02.2015
comment
Кроме того, вы изменили и объявление функции, и определение функции на один и тот же тип возвращаемого значения? Например, в верхней части файла есть double getWidth();, а затем double Box::getWidth() { return width }. Они должны совпадать. - person Alejandro; 23.02.2015