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’是私有的