我有一份上学的任务:
我。创建价格为150美元且类型为“经典”的古典吉他对象。将新价格设置为100美元,并显示有关吉他对象的所有信息。
II。制作价格为135美元且类型为“电”的电吉他物品。在促销时更改价格并显示有关Guitar对象的所有信息。
我试图自己解决这个问题,但我是C ++的新手,而且我遇到了我无法理解的编译错误。
这是我在 Guitar.h 文件中创建的课程。
#pragma once
#include<iostream>
#include <string>
#include<sstream>
using namespace std;
class Guitar
{
private:
string type;
double price;
public:
Guitar(string type, double price);
string getType();
double getPrice();
void setPrice(double newPrice);
void setPrice(bool promotion);
string toString();
};
这是 Guitar.cpp 文件
中的类实现#include "Guitar.h"
Guitar::Guitar(string typeclass, double priceclass)
{
type = typeclass;
price = priceclass;
}
string Guitar::getType()
{
return type;
}
double Guitar::getPrice()
{
return price;
}
void Guitar::setPrice(double newPriceclass)
{
price = newPriceclass;
}
void Guitar::setPrice(bool promotion)
{
if (promotion == true)
price *= 0.9;
}
string Guitar::toString()
{
stringstream info;
info << "Guitar Type: " << type << endl
<< "Price: " << price << endl;
return info.str();
}
最后我有我的主文件 GuitarApp.cpp
#include"Guitar.h"
int main()
{
Guitar guitar1("Classical", 150.0);
guitar1.setPrice(100) << endl;
cout << guitar1.toString() << endl;
Guitar guitar2("Electrical", 135.0);
guitar2.setPrice(true);
cout << guitar2.toString() << endl;
}
我有两个错误:
- 多个重载函数
匹配Guitar::setPrice
的实例与参数列表- 醇>
Guitar::setPrice
模糊调用重载函数。
有人可以向我解释错误以及我应该怎么做才能编译代码?
修改:将100
更改为100.0
后,又出现了4个错误:
- 形式参数列表中的不匹配
- 表达式必须具有整数或无范围枚举类型
- 无法确定功能模板
std::endl
的哪个实例;意图是- &#39;&lt;&lt;&#39;:无法解决功能过载
醇>
所有错误都在我的GuitarApp.cpp的第7行,即
guitar1.setprice(100.0)<<endl;
如果我要将吉他的价格从100.0
编辑回100
,我会得到我最初的两个错误。
答案 0 :(得分:3)
文字100
的类型是int
。由于int
与bool
一样容易转换为double
,因此应该调用哪些函数是不明确的。
将100
更改为100.0
(double
字面值)应解决此问题。
答案 1 :(得分:-1)
通常我们没有在这里修理家庭作业。最好问一下&#34;为什么这行代码不起作用&#34;而不是在这里扔一堆作业,希望能让其他人做好准备......
请记住,您的问题是&#34;关闭主题&#34;这是因为:
寻求调试帮助的问题(&#34;为什么这段代码不起作用?&#34;)必须包括所需的行为,特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没用。
好的,您的代码有以下语法错误:
guitar1.setPrice(100.) ; // see the "." behind the number!
你需要方法:
void setPrice(double newPrice);
void setPrice(bool promotion);
你写道:
guitar1.setPrice(100)
100
是int
而不是double
,而不是bool
。因此,编译器无法决定从您的100 bool
中获取值true
,还是将其设为double
,其值为100.
。因此,只需添加一个点,使您的值成为编译器为double
的浮点值。
下一个错误:
cout << guitar2.toString() << endl; // see the "2" behind guitar !
只有一个错字......
一些评论:
在标题和源文件中拆分这样的类很糟糕!优化器没有机会内联函数。
使用using namespace std;
可能会很糟糕!编写std :: string会更好,你需要看看你的定义来自哪个命名空间。这会使工作更多,但稍后阅读会更好,特别是如果您使用多个库中的多个命名空间。
说明:
在第一个视图中输入一些字符很容易。但是如果你以后(重新)在一个更大的应用程序中使用你的代码,你必须处理很多库,这些库可能会定义函数/类/与其他库相同的名称,你开始改变你的代码。
一个简单的例子就是将posix读取和istream读取到位。在这里给出一个&#39; :: read&#39;也是一个好主意。选择未绑定到命名空间的posix。
提示不使用using namespace
是教条主义吗?我个人的经验很简单,如果您使用它,如果您的代码稍后(重新)用于更大的应用程序,则可能会遇到问题。对于 me ,必须编写我的代码,可以<重新>使用(重新)使用而不会出现问题,或者将来很多采用/更正。
您必须决定:保存一些字符以便今天输入,以后可能会遇到麻烦或立即开始工作。
也许家庭作业代码可以这样做。但我认为谈论这种代码编写可能出现的问题是一个很好的观点。