读书人

friend 不能访问私有成员为什么? S

发布时间: 2012-02-29 16:44:10 作者: rapoo

friend 不能访问私有成员,为什么? STL 码剖析里的代码
#include <iostream>
using namespace std;

class INT
{
friend ostream& operator < <(ostream& os, const INT& i);

public:
INT(int i):m_i(i){};

INT& operator++()
{
++(this-> m_i );
return *this;
}

const INT operator++(int)
{
INT temp=*this;
(this-> m_i)++;
return temp;
}

INT& operator--()
{
--(this-> m_i);
return *this;
}

const INT operator--(int)
{
INT temp=*this;
(this-> m_i)--;
return temp;
}


int& operator*()const
{
return (int&)m_i;
}

private:
int m_i;
};

ostream& operator < <(ostream os, const INT& i)
{
os < < '[ ' < <i.m_i < < '] ';
return os;
}

int main()
{
INT I(5);
cout < <I++;
cout < <++I;
cout < <I--;
cout < <--I;
cout < <*I;
}

[解决办法]
参数少了个引用- -
ostream& operator < <(ostream& os, const INT& i)
{ // 这里...
os < < '[ ' < <i.m_i < < '] ';
return os;
}
[解决办法]
ostream& operator < <(ostream os, const INT& i)
这个定义有问题
这里的ostream应该就是你定义的ostream流,如果不加引用就成了拷贝,而ostream流不允许拷贝。
[解决办法]
1)
声明定义不一致
改成

ostream& operator < <(ostream& os, const INT& i)
{
os < < '[ ' < <i.m_i < < '] ';
return os;
}

2)

改成

ostream& operator < <(ostream& os, int& a)
{
os.operator < <(a);
return os;
}

int main()
{
cout < <1 < <2 < <3;

return 0;
}

[解决办法]
把using namespace std;改成
using std::cout;
using std::ostream;
这样就可以避免冲突了。
ostream& operator < <(ostream &os, const INT& i)
{
os < < '[ ' < <i.m_i < < '] ';
return os;
}
[解决办法]
回:Inhibitory()

这里如果定义成const ostream &os也是错误的
// 难道你想对一个const做 " < < "(也就是修改其内部数据)也不报错,你会更满意?
[解决办法]
我曾遇到过楼主类似的问题,后来才弄明白原来是namespace std;名称空间冲突。如boost_star() ( ) 兄台所说:using std::cout; using std::ostream;
或一定要用using namespace std;请加上下面两句
class INT;
ostream& operator < <(ostream& os, const INT& i);
进行全局声明也不会有错了。

读书人网 >C++

热点推荐