尝试返回std :: string时std :: logic_error

时间:2017-07-12 20:28:41

标签: c++

我已经使用一个可以显示框测量值的类编写了一些代码。我这样做是通过toString()方法输出它似乎正在工作,但是当我运行程序时,我得到以下错误:

Height: 1 Width: 1 Depth: 1terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

然后程序崩溃了。另外我注意到程序在3维后没有显示音量。

以下是代码:

#include <iostream>
#include <iomanip>      // for output formatting
#include <stdexcept>    // for out_of_range
#include <sstream>      // for stringstream
#include <string>
#include <cstdlib>      // for system()

using namespace std;

class Box 
{

    public:
        // Constructors
        Box(double height=1, double width=1, double depth=1);

        // Mutators
        void setHeight(double height);
        void setWidth(double width);
        void setDepth(double depth);

        // Accessors
        double getHeight() const {return (boxHeight);};
        double getWidth() const {return (boxWidth);};
        double getDepth() const {return (boxDepth);};
        double getVolume() const; 
        string toString() ;
    private:
        double boxHeight;
        double boxWidth;
        double boxDepth;
        double boxVolume;
};

int main()
{

    cout << "\nBox Mesurement!";
    cout << "\n===============";
    cout << endl;

    Box boxDem(true);

// WHERE THE STRING IS DISPLAYED
        cout << "\n" << boxDem.toString();
        cout<< endl;    
        cout << "\n" << boxDem.getVolume();

    return 0;
}

Box::Box(double height, double width, double depth)
{
    setHeight(height);
    setWidth(width);
    setDepth(depth);
}

void Box::setHeight(double height)
{
    const double MIN = 0.01;

    if (height > 0 && height < MIN)
    {
        height = 0.01;
        boxHeight = height;
    }
    else if (height < 0)
    {
        height *= -1;
        boxHeight = height;
    }
    else 
    {
        boxHeight = height;
    }
}
void Box::setWidth(double width)
{
    const double MIN = 0.01;

    if (width > 0 && width < MIN)
    {
        width = 0.01;
        boxWidth = width;
    }
    else if (width < 0)
    {
        width *= -1;
        boxWidth = width;
    }
    else 
    {
        boxWidth = width;
    }
}
void Box::setDepth(double depth)
{
    const double MIN = 0.01;

    if (depth > 0 && depth < MIN)
    {
        depth = 0.01;
        boxDepth = depth;
    }
    else if (depth < 0)
    {
        depth *= -1;
        boxDepth = depth;
    }
    else 
    {
        boxDepth = depth;
    }
}

double Box::getVolume() const
{
    double volume = 0.0;

    volume = getHeight() * getHeight() *getDepth();

    return volume;

}

// WHERE THE PROBLEM IS
    string Box::toString() 
    {
        cout << "Height: " << getHeight() << " Width: " << getWidth() << " Depth: " << getDepth();
        return 0;
    }

1 个答案:

答案 0 :(得分:5)

cout用于输出内容到命令行,但是你正在编写一个应该返回string的函数,这没什么意义。

ostringstream是一个简洁的类,允许您使用与cout相同的机制构建字符串,试试这个:

string Box::toString() 
{
    std::ostringstream result;
    result << "Height: " << getHeight() << " Width: " << getWidth() << " Depth: " << getDepth();
    return result.str();
}