c++命名空间三种实现文件的区别
来源:互联网 发布:优化实践技能 编辑:程序博客网 时间:2024/05/20 13:05
在命名空间的情况下,也是将声明放在.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’是私有的
- c++命名空间三种实现文件的区别
- Flex4下面的三种命名空间
- 内核源码阅读(三)进程命名空间和用户命名的实现
- javascript命名空间的实现
- 命名空间和Action的三种创建方法
- C/C++:命名空间
- 程序集/命名空间/类型的区别
- 程序集和命名空间的区别
- 命名空间|注释|快捷键|三种循环
- C++ 命名空间三种用法
- DateAndTime 的命名空间Microsoft.VisualBasic(C#)
- C语言,模拟命名空间的方法
- C++命名空间的使用
- .NET处理XML文件的命名空间
- xml文件中命名空间的含义
- 资源文件xml里的命名空间
- Android布局文件的命名空间
- 命名空间与头文件的关系
- Java 排序实现
- vsftp功能分析及虚拟用户服务
- Java通道方法写文件中缓冲区建立的原则
- poj 3162(dfs+单调队列)
- Uva 562 背包DP
- c++命名空间三种实现文件的区别
- ViewPager例子//水平滑动
- C++标准模板库分析之二
- 六款优秀的Linux Web缓存开源软
- Ubuntu linux中怎么查看自己的串口连接情况
- 原码、反码、补码、移码
- [Ext JS 4] 实战之Grid, Tree Gird 动态添加行
- 最近链接
- java : FILE , FILEINPUTSTREAM, FILEREADER,WRITER ECTS.