初学C++,关于这个hpp,cpp问题

liu51301 2011-05-18 09:19:08

// Sales_item.hpp
#ifndef SALEITEM_H
#define SALEITEM_H
#include <iostream>
#include <string>

class Sales_item {
public :
std::istream& input(std::istream& in);
std::ostream& output(std::ostream& out) const;
double avg_price() const;
Sales_item add(Sales_item& other);
bool same_isbn(const Sales_item &rhs) const
{
return isbn == rhs.isbn;
}
Sales_item::Sales_item() : units_sold(0), revenue(0.0) {}

private:
std::string isbn;
unsigned units_sold;
double revenue;
};

#endif

// Sales_item.cpp
#include "Sales_item.hpp"

std::istream& Sales_item::input(std::istream& in)
{
double price;
in >> isbn >> units_sold >> price;

if (in)
revenue = units_sold * price;
else {
units_sold = 0;
revenue = 0.0;
}
return in;
}
std::ostream& Sales_item::output(std::ostream& out) const
{
out << isbn << "\t" << units_sold << "\t"
<< revenue << "\t" << avg_price();
return out;
}

double Sales_item::avg_price() const
{
if (units_sold)
return revenue / units_sold;
else
return 0;
}

Sales_item Sales_item::add(Sales_item& other)
{
revenue += other.revenue;
units_sold += other.units_sold;
return *this;
}

// 1.cpp
#include <iostream>
#include "Sales_item.hpp"
using namespace::std;

int main()
{
Sales_item item;
cout << "Enter some transations(Ctrl + Z to end):"
<< endl;
while (item.input(cin)) {
cout << "The transations readed is :" << endl;
item.output(cout);
cout << endl;
}
return 0;
}

在主程序中,书中#include "Sales_item.hpp",编译成功,但连接错误,vc6.0提示:

1.obj : error LNK2001: unresolved external symbol "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall Sales_item::output(class std::basic_ostream<char,struct std::char_traits<char> > &)const " (?output@Sales_item@@QBE
AAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV23@@Z)
1.obj : error LNK2001: unresolved external symbol "public: class std::basic_istream<char,struct std::char_traits<char> > & __thiscall Sales_item::input(class std::basic_istream<char,struct std::char_traits<char> > &)" (?input@Sales_item@@QAEAAV?$bas
ic_istream@DU?$char_traits@D@std@@@std@@AAV23@@Z)
Debug/1.exe : fatal error LNK1120: 2 unresolved externals

改成了Sales_item.cpp就能成功运行。
在主程序中使用Sales_item类,到底应该包含哪个文件,Sales_item.hpp还是Sales_item.cpp??
...全文
326 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2011-05-18
  • 打赏
  • 举报
回复
写了Sales_item.hpp就不要总弄一个Sales_item.cpp了
直接把实现也写Sales_item.hpp里面

Sales_item.hpp一般是模板的情况下用的比较多, 比如boost里面有大量的.hpp
.hpp貌似不会作为单独编译单元, 而是并如包含它的那个文件的编译单元
另外它也受到.h的一些限制, 比如在.hpp中定义变量, 有多个文件包含这个.hpp时, 链接时将会出现重定义的错误

下面一篇文章楼主可以看看, 对你有用
http://blog.csdn.net/q191201771/archive/2011/05/06/6399820.aspx
bargio_susie 2011-05-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]

用.h代替.hpp以及用预编译 #ifndef xx
#define xx

#endif
[/Quote]


此言差已,用什么做后缀这个无所谓
Qyee 2011-05-18
  • 打赏
  • 举报
回复
lz是在哪个编译器下做的。我在linux也遇到过这个问题,必须cpp文件就没问题了。。。
那是在kdevelop下。。。应该包含.h文件
不过在centos下的eclipse下的做法是把.h cpp文件建成lib**.so文件,然后再链接到使用的工程中,包含.h文件就没问题了。
無_1024 2011-05-18
  • 打赏
  • 举报
回复
用.h代替.hpp以及用预编译 #ifndef xx
#define xx

#endif
yfk 2011-05-18
  • 打赏
  • 举报
回复
正确做法应该是包含头文件~
这边文章,LZ可以看下:
http://www.cyd360.tk/2011/03/108

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧