| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5757 人关注过本帖
标题:友元函数里无法访问类的私有成员函数?
只看楼主 加入收藏
梦桐云轩
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-9-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
友元函数里无法访问类的私有成员函数?
Student.rar (12.47 KB)
  
    在学习C++ Primer 5第14章私有继承时,student类的代码在VC6下编译出现“error   C2614:   'Student '   :   illegal   member   initialization:   'string '   is   not   a   base   or   member ”,后将头文件中用了using   namespace   std;   然后去掉所有的std::,就没这个问题了。
    但是接着在友元重载“<<”时,提示“”error C2248: 'arr_out' : cannot access private member declared in class 'Student',这个arr_out成员函数是私有成员,但是重载函数已经声明为友元了,应该可以访问才对。(将arr_out设置成公有成员后,可以成功编译。)
    然后我接着定义一个测试的友元函数,它可以正常访问arr_out私有成员函数。
 
1.studnet .h  头文件,类声明
程序代码:
 #include <iostream>

 #include <valarray>

 #include <string> 

 using namespace std;   //增加的语句

类声明中arr_out私有成员部分

 class Student : private string, private valarray<double>

 { 

 private:
     typedef valarray<double> ArrayDb;
     // private method for scores output
     ostream & arr_out(ostream & os) const;   //arr_out私有成员函数
 ……//省略其他部分
     // output
     friend ostream & operator << (ostream & os,
                 const Student & stu);                         //友元重载<<,实现中访问arr_out
   friend ostream & test(ostream & os,const Student & stu);  //测试友元函数

} 


2.student.cpp 类实现文件
程序代码:
// private method
 ostream & Student::arr_out(ostream & os) const

 {
     int i;
     int lim = ArrayDb::size();
     if (lim > 0)
     {
         for (i = 0; i < lim; i++)
         {
             os << ArrayDb::operator[](i) << " ";
             if (i % 5 == 4)
                 os << endl;
         }
         if (i % 5 != 0)
             os << endl;
     }
     else
         os << " empty array ";
     return os;
}

 ……//省略其他部分

 // use string version of operator<<()
 ostream & operator << (ostream & os, const Student & stu)

 {
     os << "Scores for " << (const string &) stu  << ":\n";
     stu.arr_out(os);  // use private method for scores   无法访问arr_out私有成员
     return os;

 }

//测试友元函数是否能访问私有成员
 ostream & test(ostream & os,const Student &stu)

 {
         os << "Scores for " << (const string &) stu  << ":\n";
     stu.arr_out(os);  // use private method for scores
          return os;

 }

;

  
3.附件是修改后的问题代码和书本源代码(在vc上也是有问题的)
 
搞了好长时间,还是想不通,很是纠结,故贴上来,特来求教。




[ 本帖最后由 梦桐云轩 于 2011-9-25 16:38 编辑 ]
搜索更多相关主题的帖子: 函数 access declared private cannot 
2011-09-25 15:24
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:14 
完全正常啊,是不是编译器有问题
2011-09-25 16:51
梦桐云轩
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-9-25
收藏
得分:0 
回复 2楼 specilize
我也是觉得没什么错误,并且用测试函数测试也可以访问友元,就是在重载操作符<<时有问题。
你测试一下,我发的附件。
2011-09-25 16:55
梦桐云轩
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-9-25
收藏
得分:0 
回复 2楼 specilize
我在GCC编译器下编译通过,看来是微软的编译使用的不是标准库导致的问题。
2011-09-25 20:02
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
回复 4楼 梦桐云轩
是vc6太老了,很多都不符合标准C++,所以老是报一些莫名其妙的错误,你用vs什么的就不会的
2011-09-25 20:55
快速回复:友元函数里无法访问类的私有成员函数?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013486 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved