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’是私有的
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’是私有的
相关文章推荐
- 2,3 c++中 #include< >头文件 和 命名空间 Using namespace std的解释和区别
- C++ 头文件和命名空间
- C++中的hash_map__Linux下g++和Windows下VC++下头文件,命名空间
- c++中的头文件(.h)和实现文件(.cpp)区别
- C++实现某文件夹下文件重命名
- 头文件中不要使用命名空间 C++
- C++ 知识点(五):高级编程:文件和流,异常处理,动态内存,命名空间
- C++ 命名空间三种用法
- C++多线程——三种线程实现方式的区别与实际应用建议
- 【c++】模拟实现循环队列 三种方法(标识、浪费一个空间、计数器)
- Docker核心实现技术 (命名空间 & 控制组 & 联合文件系统 & Linux网络虚拟化支持)
- c++命名空间及头文件
- C++简单学习(Part3_lecture 10)(文件、流、异常处理、动态内存、命名空间)
- C++学习笔记:高级编程:文件和流,异常处理,动态内存,命名空间
- C++ 基础 命名空间 类头文件 类的实现写法
- 使用命名空间、头文件和实现文件
- C++中的hash_map——Linux下g++和Windows下VC++下头文件,命名空间
- SPORE,一个很好的实现JS命名空间的管理,模块的定义,与自动加载依赖模块的脚本文件
- C++定义自己的命名空间和头文件
- 使用命名空间、头文件和实现文件