注册 登录
编程论坛 C++教室

友元函数里无法访问类的私有成员函数?

梦桐云轩 发布于 2011-09-25 15:24, 5757 次点击
只有本站会员才能查看附件,请 登录
  
    在学习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 编辑 ]
4 回复
#2
specilize2011-09-25 16:51
完全正常啊,是不是编译器有问题
#3
梦桐云轩2011-09-25 16:55
回复 2楼 specilize
我也是觉得没什么错误,并且用测试函数测试也可以访问友元,就是在重载操作符<<时有问题。
你测试一下,我发的附件。
#4
梦桐云轩2011-09-25 20:02
回复 2楼 specilize
我在GCC编译器下编译通过,看来是微软的编译使用的不是标准库导致的问题。
#5
specilize2011-09-25 20:55
回复 4楼 梦桐云轩
是vc6太老了,很多都不符合标准C++,所以老是报一些莫名其妙的错误,你用vs什么的就不会的
1