注册 登录
编程论坛 C++教室

构造函数出错。

shanexia 发布于 2014-07-29 16:15, 510 次点击
#include <iostream>
#include<string>
using namespace std;


class sales_item
{
public:
sales_item(const string &book):isbn(book),units_sold(0),revenue(0.0)
{


}
sales_item(istream &is);
void print()
{
std::cout<<sales_item().isbn<<endl;
}
private:
int units_sold;
double revenue;
string isbn;
};


int main()
{
sales_item s1("let us do it!");
s1.print();
return 0;
}
错误信息: no matching function for call to *sales_item::sales_item()*|
这个是怎么回事 啊?我的原意是想利用print函数查看isbn的值的,没有想到出现了错误,如果给book赋上默认实参就不会出现错误了。
3 回复
#2
福尔摩斯2014-07-29 17:47
你是不是看《C++ Primer》这本书?
你这个貌似不是书上的代码, 很多年前看的, 书中的例题记不太清

说下我看到的你的错误:
1、 sales_item(istream &is); 这个构造函数只有声明而没有函数定义, 当然, 有些编译器是不会要求你提供的;
2、
程序代码:

void print()
{
    std::cout<<sales_item().isbn<<endl;    // 你这个是逻辑问题, sales_item()的结果是什么?
}

改成
程序代码:

void print()
{
    cout << this->isbn << endl;    // 你在一开始就使用了 using namespace std; 为什么这里还要std::
}


[ 本帖最后由 福尔摩斯 于 2014-7-29 17:49 编辑 ]
#3
shanexia2014-07-29 18:07
回复 2 楼 福尔摩斯
恩。是这样的,这个是我自己写的程序。 其实直接删去sales_item().也可以。
其实我还有一个疑惑,就是你说的那个sales_item(istream &is);问题。我们应该怎样运用这个istream呢?
#include <iostream>
#include<string>
using namespace std;


class sales_item
{
public:
sales_item(const string &book="fuck!"):isbn(book),units_sold(0),revenue(0.0)
{


}
sales_item(istream &is=cin)
{


}
void print()
{
std::cout<<isbn<<endl;
cout<<units_sold<<endl;
cout<<revenue<<endl;
}
private:
int units_sold;
double revenue;
string isbn;
};


int main()
{
sales_item s1(cin);
s1.print();
return 0;
}
这个我想实现的功能是,通过cin读入字符串,为何得不到我想要的结果,打印出的是一组垃圾数字。为什么啊?
#4
福尔摩斯2014-07-29 21:27
回复 3 楼 shanexia
程序代码:

sales_item(istream &is=cin)
{

}

唉, 你这个想法有逻辑问题:

首先, 你想过 cin输入流 输入的数据存哪里? 没有存储就显示结果当然是乱码;

其次, 我搞不明白, 参数为什么使用输入流? 你直接输入给变量, 然后变量再通过 构造函数 传给 类对象不就好了

当然, 我这不是在骂你或者损你, 能通过自己想法去重新整合自己所学到的知识, 这种方法值得学习 活学活用。

[ 本帖最后由 福尔摩斯 于 2014-7-29 21:29 编辑 ]
1