您的位置:首页 > 编程语言 > C语言/C++

c++命名空间三种实现文件的区别

2013-10-06 15:39 429 查看
在命名空间的情况下,也是将声明放在.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’是私有的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: