C ++函数没有正确返回:调用字符串析构函数

时间:2012-03-28 21:05:03

标签: c++

我在别处问过这个问题并得到了一个模糊的答案,我认为这是因为我不理解如何使用new关键字。

我正在研究的项目只是帮助我开始学习C ++,但我来自Java的知识。它只是我最终将在基于文本的游戏中使用的结构和函数的集合。

我遇到问题的函数是getStats(),它将返回结构木的变量的一些值以及它继承的结构。

/**
*Returns information regarding the status of the wood.
*@param the wood to retrieve.
*@return A string representing the stats.
*/
string getStats(wood toGet)
{
    string toReturn;

    //Substruct specific variables.
    toReturn += "Type: ";
    toReturn += toGet.type;
    toReturn += "\nAge: ";
    toReturn += toGet.age;

    //Superstruct variables.
    toReturn += "\nHeight: ";
    toReturn += toGet.height;
    toReturn += "\nWidth: ";
    toReturn += toGet.width;
    toReturn += "\nWeight: ";
    toReturn += toGet.weight;
    toReturn += "\nGeneric name: ";
    toReturn += toGet.name;
    toReturn += "\nState of Matter: ";
    toReturn += toGet.stateOfMatter;
    toReturn += "\nFlammable: ";
    toReturn += toGet.flammable;
    toReturn += "\n";

    return toReturn;
}

我意识到我现在正以愚蠢的方式做这件事,我会用数组和循环重做它,但是现在我正在使用这种方法。在另一个网站上,我问他们,他们告诉我使用new,但是当我这样做时:

string toReturn = new string;

它给了我一个错误:

  

‘std::string* {aka std::basic_string *}’转换为非标量类型‘std::string {aka std::basic_string }’请求

完整的来源是:http://pastebin.com/UawrwYj7

样本运行的输出低于。

  

类型:桦木
  年龄:
  身高:
  宽度:
  重量:d
  通用名称:
  物质状况:实心
  易燃:

2 个答案:

答案 0 :(得分:4)

1)您不需要new。 C ++不是Java。在C ++中,对象在声明时就会存在。

2)表达式w.getStats(w)是多余的。您不需要将w作为参数传递,它将作为this指针隐式传递。

3)你不能这样做:

double x;
toReturn += x;

没有std::string operator+= (double)。在最新版本的C ++标准之前,std::string类通常不进行格式化。如果您有最新的编译器,则可以将heightwidthweight等代码替换为:

double x;
toReturn += std::to_string(x);

但是,我建议您使用运算符<<。根据您的使用方式,这将允许您格式化字符串或将数据发送到文件。

这是您更新的getStats

// Untested code
std::string getStats()
{
    std::ostringstream oss;
    oss << "Type: " << this->type << "\n";
    oss << "Age: " << this->age << "\n";
    oss << "Height: " << this->height << "\n";
    oss << "Width: " << this->width << "\n";
    // and so on
    return oss.str();
}

稍后,当您了解如何覆盖operator<<时,请尝试以下方式:

friend std::ostream& operator<<(std::ostream& os, const wood& w) {
  os << "Type: " << w.type << "\n";
  os << "Age: " << w.age << "\n";
  os << "Height: " << w.height << "\n";
  os << "Width: " << w.width << "\n";
  // and so on
  return os;
}
std::string getStats() {
  std::ostringstream oss;
  oss << *this;
  return oss.str();
}

答案 1 :(得分:3)

当调用原始版本时,首先构造,填充字符串,然后返回一个副本,原始字符串(在getStats()的堆栈上)将被销毁。

new string;指针返回给字符串,而不是字符串对象,因此保存它的变量必须是指针 - string *,而不是string。然而,这涉及动态内存管理 - 在这种情况下你不需要它。

总结:用C ++做任何事情,得到一本不错的书并至少学习基础知识,因为C ++与Java完全不同。

修改:另外,为了让您的功能更好地运行,请阅读stringstream