加了个自定义命名空间,是不是友元函数无法访问类的私有成员了?
请大神们看看下面的代码,看看怎么改?
Person类
namespace liuyx{
#ifndef PERSON_H
#define PERSON_H
class Person
{
friend Person operator+(const Person&,const Person&);
friend std::ostream& operator<<(std::ostream&,const Person&);
friend std::istream& operator>>(std::istream&,Person& p);
public:
Person(const std::string& nm="",int a=0,int s=0):name(nm),age(a),salary(s){};
Person(const Person& p){
name = p.name;
age = p.age;
salary = p.salary;
}
Person& operator=(const Person& p){
name = p.name;
age = p.age;
salary = p.salary;
return *this;
}
Person& operator+=(const Person& p){
if(!this->same_name(p))
throw std::runtime_error("The two param must be the same type Person");
salary += p.salary;
return *this;
}
const bool same_name(const Person& p)const{
return name == p.name;
}
private:
std::string name;
int age;
int salary;
};
#include "Person.cpp"
#endif
}
Person类的实现文件Person.cpp
#include "Person.h"
namespace liuyx{
Person operator+(const Person& p1,const Person& p2){
Person p = p1;
p += p2;
return p;
}
std::ostream& operator<<(std::ostream& os, const Person& p){
os << "name: " << "\t" << p.name
<< "\nage: " << "\t" << p.age
<< "\nsalary: " << "\t" << p.salary;
return os;
}
std::istream& operator>>(std::istream& is,Person &p){
std::cout << "Enter a person's name first,then age,and then salary:"<< std::endl;
is >> p.name >> p.age >> p.salary;
if(!is)
p = Person();
return is;
}
}
测试类:
#include <iostream>
#include <string>
#include "Person.h"
using namespace std;
using liuyx::Person;
using liuyx::operator +;
using liuyx::operator <<;
using liuyx::operator >>;
int main(){
Person p1,p2;
std::cin >> p1 >> p2;
try{
p1 += p2;
}catch(...){
throw;
}
std::cout << p1 << endl;
return 0;
}
最后提示友元函数无法访问类的私有成员
出错信息如下:
1>------ 已启动生成: 项目: t, 配置: Debug Win32 ------
1>正在编译...
1>main.cpp
1>c:\documents and settings\user\桌面\c++\t\t\Person.cpp(12) : error C2248: “liuyx::Person::name”: 无法访问 private 成员(在“liuyx::Person”类中声明)
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(33) : 参见“liuyx::Person::name”的声明
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(5) : 参见“liuyx::Person”的声明
1>c:\documents and settings\user\桌面\c++\t\t\Person.cpp(13) : error C2248: “liuyx::Person::age”: 无法访问 private 成员(在“liuyx::Person”类中声明)
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(34) : 参见“liuyx::Person::age”的声明
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(5) : 参见“liuyx::Person”的声明
1>c:\documents and settings\user\桌面\c++\t\t\Person.cpp(13) : error C2248: “liuyx::Person::salary”: 无法访问 private 成员(在“liuyx::Person”类中声明)
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(35) : 参见“liuyx::Person::salary”的声明
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(5) : 参见“liuyx::Person”的声明
1>c:\documents and settings\user\桌面\c++\t\t\Person.cpp(18) : error C2248: “liuyx::Person::name”: 无法访问 private 成员(在“liuyx::Person”类中声明)
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(33) : 参见“liuyx::Person::name”的声明
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(5) : 参见“liuyx::Person”的声明
1>c:\documents and settings\user\桌面\c++\t\t\Person.cpp(18) : error C2248: “liuyx::Person::age”: 无法访问 private 成员(在“liuyx::Person”类中声明)
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(34) : 参见“liuyx::Person::age”的声明
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(5) : 参见“liuyx::Person”的声明
1>c:\documents and settings\user\桌面\c++\t\t\Person.cpp(18) : error C2248: “liuyx::Person::salary”: 无法访问 private 成员(在“liuyx::Person”类中声明)
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(35) : 参见“liuyx::Person::salary”的声明
1> c:\documents and settings\user\桌面\c++\t\t\Person.h(5) : 参见“liuyx::Person”的声明
1>生成日志保存在“file://c:\Documents and Settings\user\桌面\C++\t\t\Debug\BuildLog.htm”
1>t - 6 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
麻烦帮忙看看是什么问题,谢谢~!