标题:友元函数里无法访问类的私有成员函数?
取消只看楼主
梦桐云轩
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-9-25
结帖率:100%
已结贴  问题点数:20 回复次数:2 
友元函数里无法访问类的私有成员函数?
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
梦桐云轩
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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-350842-1-1.html




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

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