关于友元函数访问私有成员解决方案
关于友元函数访问私有成员
友元函数在访问私有成员总是出现无法访问的问题,对于类而言一旦声明某函数为友元函数是不是意味着可以使用该类的任何成员,如果是,那么以下代码确重视报错,不知为何,谢谢大家了
class tamp
{
friend ostream& operator << (ostream &os,const tamp &obj);
public:
tamp(int *pi): pointer2(pi){}
int& operator * (){ return *pointer2;}
protected:
int * pointer2;
};
……
……
ostream& operator << (ostream &os,const tamp &obj)
{
os<< *(obj.pointer2);
return os;
}
编译器一直反映:
error C2248: 'pointer2' : cannot access private member declared in class 'tamp'
------解决方案--------------------
都知道vc6.0对友员的支持有问题。你可以换个编译器试试。
------解决方案--------------------
问题应该是出在这个友元函数的第二个参数,引用。
你这样写,调用时传入一个tamp对象,他是不能访问保护类成员的。obj作为他的引用,和这个对象指向同一块内存,是同一个对象,它自然也不能访问保护类成员。
因此,VC6报这个错误是很正确的。
------解决方案--------------------
语法没问题~
编译环境的问题
友元函数在访问私有成员总是出现无法访问的问题,对于类而言一旦声明某函数为友元函数是不是意味着可以使用该类的任何成员,如果是,那么以下代码确重视报错,不知为何,谢谢大家了
class tamp
{
friend ostream& operator << (ostream &os,const tamp &obj);
public:
tamp(int *pi): pointer2(pi){}
int& operator * (){ return *pointer2;}
protected:
int * pointer2;
};
……
……
ostream& operator << (ostream &os,const tamp &obj)
{
os<< *(obj.pointer2);
return os;
}
编译器一直反映:
error C2248: 'pointer2' : cannot access private member declared in class 'tamp'
------解决方案--------------------
都知道vc6.0对友员的支持有问题。你可以换个编译器试试。
------解决方案--------------------
问题应该是出在这个友元函数的第二个参数,引用。
你这样写,调用时传入一个tamp对象,他是不能访问保护类成员的。obj作为他的引用,和这个对象指向同一块内存,是同一个对象,它自然也不能访问保护类成员。
因此,VC6报这个错误是很正确的。
------解决方案--------------------
语法没问题~
编译环境的问题