我在别处问过这个问题并得到了一个模糊的答案,我认为这是因为我不理解如何使用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
通用名称:
物质状况:实心
易燃:
答案 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
类通常不进行格式化。如果您有最新的编译器,则可以将height
,width
,weight
等代码替换为:
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
。