在命名空间的情况下,也是将声明放在.h文件中,实现放在.cpp文件中。实现时一般有三种途径:
1、用完全限定名,如:ostream& cplusplus_primer::operator<< (ostream& os,const Query& q){}
2、在 namespace cplusplus_primer{}内部实现,此时直接使用已声明的名字
3、用using namespace cplusplus_primer;引入,然后直接使用
注意:方法1和方法2的思想是把该cpp文件中的实现代码放入该命名空间中,所以实现过程中可以完全和声明一样;但是方法3的思想是把命名空间中的元素引入到该cpp文件中,此时,如果引入的是友员函数,则友员的特权会消失,即不能操纵原来的私有成员(具体原因我也不清楚,请大神指点),可以参考下面的例子:
Query.h文件:
#ifndef QUERY_H
#define QUERY_H
#include<iostream>
#include<string>
namespace cplusplus_primer
{
using namespace std;
//class Query;
//ostream& operator<< (ostream& os,const Query& q);
class Query
{
//using namespace std;
friend ostream& operator<< (ostream& os,const Query& q);
friend istream& operator>> (istream& is,Query& q);
public:
Query(string s = "",double p = 0.0):name(s),price(p){}
private:
string name;
double price;
};
}
#endif
方法2的cpp文件:
#include "Query.h"
#include<iostream>
#include<string>
#include<stdexcept>
using namespace std;
namespace cplusplus_primer
{
ostream& operator<< (ostream& os,const Query& q)
{
cout << "name = " << q.name << "\t" << "price = " << q.price ;
return os;
}
istream& operator>> (istream& is,Query& q)
{
is >> q.name >> q.price;
if(!is)
{
q = Query();
throw runtime_error("input error");
}
else return is;
}
}
运行正确!
方法3的cpp文件:
#include "Query.h"
#include<iostream>
#include<string>
#include<stdexcept>
using namespace std;
using namespace cplusplus_primer;
ostream& operator<< (ostream& os,const Query& q)
{
cout << "name = " << q.name << "\t" << "price = " << q.price ;
return os;
}
istream& operator>> (istream& is,Query& q)
{
is >> q.name >> q.price;
if(!is)
{
q = Query();
throw runtime_error("input error");
}
else return is;
}
运行出错:
Query.h:21:11: 错误: ‘std::string cplusplus_primer::Query::name’是私有的
Query.h:22:11: 错误: ‘double cplusplus_primer::Query::price’是私有的