我有一个学校作业:
i. 创建一个价格为 $150 且类型 ="古典"的古典吉他对象。将新价格设置为 $100,并显示有关吉他对象的所有信息。
ii. 创建一个价格为 $135 且类型 ="电动"的电吉他对象。在有促销时更改价格并显示有关吉他对象的所有信息。
我正在尝试自己解决它,但我是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();
};
这是我的吉他.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();
}
最后我有了我的主文件吉他应用程序.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;
}
我有 2 个错误:
与
- 参数列表
匹配的重载函数Guitar::setPrice
的多个实例Guitar::setPrice
对重载函数的模糊调用。
有人可以向我解释错误以及我应该怎么做才能编译代码吗?
编辑:将100
更改为100.0
后,我又遇到了4个错误:
- 形式参数列表
不匹配- 表达式必须具有整型或无作用域枚举类型
- 无法确定
std::endl
的函数模板的哪个实例 ;- "<<":无法解决函数过载问题
所有错误都在我的吉他应用程序的第 7 行.cpp即
guitar1.setprice(100.0)<<endl;
如果我将吉他的价格从100.0
编辑回100
,我会得到我最初遇到的两个错误。
文字100
的类型是int
。由于int
就像double
一样容易转换为bool
,因此应该调用哪些函数是模棱两可的。
将100
更改为100.0
(double
文字)应该可以解决此问题。
通常我们不会在这里修复家庭作品。最好问"为什么这行代码不起作用",而不是在这里扔一堆作业,希望从其他人那里准备好它......
还请记住,您的问题是"题外话",因为:
寻求调试帮助的问题("为什么此代码不起作用?")必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用。
好的,您的代码有以下语法错误:
guitar1.setPrice(100.) ; // see the "." behind the number!
你必须方法:
void setPrice(double newPrice);
void setPrice(bool promotion);
你写道:
guitar1.setPrice(100)
100
是int
,不是double
,也不是bool
.因此,编译器不能决定从您的 100 个中制作具有值true
的bool
或使其成为具有值100.
的double
。因此,只需添加一个点即可使您的值成为浮点值,编译器将其视为double
。
下一个错误:
cout << guitar2.toString() << endl; // see the "2" behind guitar !
只是一个错别字...
一些评论:
在标头和源文件中拆分这样的类是不好的!优化程序没有机会内联函数。
使用using namespace std;
可能很糟糕!最好写 std::string,你需要看到你的定义来自哪个命名空间。这需要更多的工作,但以后阅读要好得多,特别是如果您使用来自多个库的多个命名空间。
解释:
在第一次查看时很容易保存键入一些字符。但是,如果您稍后(重新)在更大的应用程序中(重新)使用您的代码,您必须处理许多库,这些库可能定义函数/类/与其他库之一同名的内容,您开始更改代码。
一个简单的例子是让 posix 读取和 istream 读取就地。在这里,给出一个"::read"来选择未绑定到命名空间的posix也是一个好主意。
给出不使用using namespace
的提示是教条吗?我的个人经验很简单,如果你使用它,如果你的代码以后在更大的应用程序中(重新)使用,你可能会遇到问题。对我来说,必须这样编写我的代码,可以(重新)使用而不会出现问题,或者将来会有很多采用/更正。
您必须决定:保存一些字符以在今天键入,以后可能会遇到麻烦或立即完成工作。
也许对于家庭作业代码可以这样做。但我认为谈论这种代码编写中可能出现的问题是一个很好的观点。