精华内容
下载资源
问答
  • 友元函数 无法访问私有成员

    千次阅读 2011-05-27 07:58:00
    就会提示友员函数没有访问私有成员的权限。 解决方法:去掉using namespace std;换成更小的名字空间。 例如: 含有#include 就要加上using std::string 含有#include 就要加上using std::fstream 含有#...
    #include<iostream> 
    02 using namespace std; 
    03 class cylinder 
    04
    05     friend istream operator>>(istream& is,cylinder &cy); 
    06 public:     
    07     inline double square() 
    08     {       return length*(width+height)*2+width*height*2;    } 
    09     inline double volume() 
    10     {      return length*width*height;      } 
    11 private
    12     double length; 
    13     double width; 
    14     double height; 
    15 }; 
    16 istream operator>>(istream is,cylinder &cy) 
    17
    18     cout<<"input length:"<<endl; 
    19     is>>cy.length; 
    20     cout<<"input width:"<<endl; 
    21     is>>cy.width; 
    22     cout<<"input height:"<<endl; 
    23     is>>cy.height; 
    24     return is; 
    25
    26 int main() 
    27
    28     cylinder first; 
    29     cin>>first; 
    30     cout<<first.square()<<endl; 
    31     cout<<first.volume()<<endl; 
    32     return 0; 
    33 }

    这些代码在VC6.0中不能被编译通过:提示不能访问私有成员,没有这个访问权限

    改成这样就可以了,代码如下:

    01 #include<iostream> 
    02 using std::cin; 
    03 using std::endl; using std::cout; 
    04 using std::ostream; 
    05 using std::istream; 
    06 using std::ostream; 
    07 class cylinder 
    08
    09     friend istream operator>>(istream& is,cylinder &cy); 
    10 public:     
    11     inline double square() 
    12     {       return length*(width+height)*2+width*height*2;    } 
    13     inline double volume() 
    14     {      return length*width*height;      } 
    15 private
    16     double length; 
    17     double width; 
    18     double height; 
    19 }; 
    20 istream operator>>(istream is,cylinder &cy) 
    21
    22     cout<<"input length:"<<endl; 
    23     is>>cy.length; 
    24     cout<<"input width:"<<endl; 
    25     is>>cy.width; 
    26     cout<<"input height:"<<endl; 
    27     is>>cy.height; 
    28     return is; 
    29
    30 int main() 
    31
    32     cylinder first; 
    33     cin>>first; 
    34     cout<<first.square()<<endl; 
    35     cout<<first.volume()<<endl; 
    36     return 0; 
    37 }

    原因:

    这据说是VC的一个经典BUG。和namespace也有关.

    只要含有using namespace std; 就会提示友员函数没有访问私有成员的权限。

    解决方法:去掉using namespace std;换成更小的名字空间。

    例如:
    含有#include <string>就要加上using std::string
    含有#include <fstream>就要加上using std::fstream
    含有#include <iostream>就要加上using std::cin; using std::cout; using std::ostream; using std::istream; using std::endl; 等等,需要什么即可通过using声明什么.

    下面给出流浪给的解决办法:

     

    01 //方法一:
    02 //提前声明
    03 class cylinder;
    04 istream &operator>>(istream& is,cylinder &cy);
    05   
    06 //方法二:
    07 //不用命名空间 或者 像晨雨那样写
    08 #include<iostream.h>
    09   
    10 //方法三:
    11   
    12 class cylinder
    13 {
    14     friend istream &operator>>(istream& is,cylinder &cy)//写在类里面
    15     {
    16         cout<<"input length:"<<endl;
    17         is>>cy.length;
    18         cout<<"input width:"<<endl;
    19         is>>cy.width;
    20         cout<<"input height:"<<endl;
    21         is>>cy.height;
    22         return is;
    23           
    24     }
    25 ..........
    26   
    27 //方法四:打SP6补丁,貌似不好使。。。(呵呵,是貌似也没用)
    28    
    29 //方法五:换别的对标准C++支持好的编译器,如DEV C++/。。。(呵呵)
    展开全文
  • class X { public: friend bool Y::ifelse(X&); private: int a; int b; }; class Y { public: bool ifelse(X& temp) { return temp.a > temp.b ? true : false; } ...
  • 在确认自己的代码无误后,确定一下你是否打过vcsp6补丁
    在确认自己的代码无误后,确定一下你是否打过vcsp6补丁
    
    展开全文
  • //[color=#FF0000]error:成员"teacher::num不可访问"[/color] cout<<a.num+b.num<<endl;//[color=#FF0000]error:成员"teacher::num不可访问"[/color]} int main() { student a; teacher b; }
  • 问题是在看C++primer plus 私有继承部分出现的,按照书上的代码,在VS2015中发现编译不通过,提示为无法访问类的私有成员,该错误是在重载>>运算符时出现的,而其他友元函数访问私有成员未出现错误。 解决方法:将>...

    问题是在看C++primer plus 私有继承部分出现的,按照书上的代码,在VS2015中发现编译不通过,提示为无法访问类的私有成员,该错误是在重载>>运算符时出现的,而其他友元函数访问私有成员未出现错误。

    解决方法:将>>运算符的定义放在类声明中进行,如下:

    #ifndef STUDENTC_H_
    #define STUDENTC_H_
    #include <iostream>
    #include <valarray>
    #include <string>
    
    class Student :private std::string, private std::valarray<double>
    {
    private:
    	typedef std::valarray<double> ArrayDb;
    	//private method for scores output
    	std::ostream & arr_out(std::ostream & os) const;
    public:
    	Student() :std::string("Null Student"), ArrayDb() {}
    	explicit Student(const std::string & s):std::string(s),ArrayDb(){}
    	explicit Student(int n): std::string("Nully"),ArrayDb(n){}
    	Student(const std::string & s,int n):std::string(s),ArrayDb(n){}
    	Student(const char * str, const ArrayDb & a) :std::string(str), ArrayDb(a) {}
    	Student(const char * str,const double * pd, int n):std::string(str),ArrayDb(pd,n){}
    	~Student(){}
    	double Average() const;
    	double & operator[](int i);
    	double operator[](int i) const;
    	const std::string & Name() const;
    	//friends
    		//input
    	friend std::istream & operator >> (std::istream & is, Student & stu);
    	friend std::istream & getline(std::istream & is, Student & stu);
    	//out put(就是这个有问题)
    	friend std::ostream & operator<<(std::ostream & os, Student & stu)
    	{
    		os << "Scores for " << (const std::string &)stu << ":\n";
    		stu.arr_out(os);
    		return os;
    	}
    };
    
    #endif
    另外将studenti.cpp中的相应定义去掉,就可以编译通过,且运行正常。

    看网上其他大佬解释说这是vs的编译器有问题= =   在此不深究。

    展开全文
  • 友元类方法总结:1、包含声明”friend”的类,必须在((包含其声明的友元函数)的那个类)之前事先声明下————因为在Employer类中用到”Employee&”,不然无法访问该引用的私有成员。 2、被声明为友元的函数,必须...

    “friend声明友元函数,友元函数却依旧无法访问该类的私有属性”的解决

    一次C++作业题, 搞了很久弄明白了, 虽然成功了, 但VS2015依旧有红线提示错误, 不过不影响编译、运行, 这似乎是VS自身的一个BUG。
    解决
    友元类方法小结:
    1. 包含声明”friend”的类,必须在((包含其声明的友元函数)的那个类)之前事先声明下————因为在Employer类中用到”Employee&”,不然无法访问该引用的私有成员。
    2. 被声明为友元的函数,必须在类内声明,然后在将其声明为友元函数的类的后面定义。
    3. 还有一个我个人犯的低级错误——在声明友元函数时,忘记加该函数的作用域了。。。

    作业代码如下:

     #include < iostream >
     #include < string >
    using namespace std;
    
    class Employee;
    
    class Employer
    {
    public:
        Employer(string a) {
            Name = a;
        };
        void editEmployee(Employee & person, double salary, string post);
    private:
        string Name;
    };
    
    class Employee {
    public:Employee(int a, string b, double c, string d) {
        ID = a;
        Name = b;
        Salary = c;
        Post = d;
    }
           friend void Employer::editEmployee(Employee & person, double salary, string post);
           void printInf() {
               cout << "ID:" << ID << "\t" << "Name:" << Name << "\t" << "Salary:" << Salary << "\t" << "Post:" << Post << endl;
           }
    protected:
    private:
        int ID;
        string Name;
        double Salary;
        string Post;
    };
    
    void Employer::editEmployee(Employee & person, double salary, string post) {
        person.Salary = salary;
        person.Post = post;
    };
    
    int main()
    {
        Employee sb(22, "abc", 1.23, "a");
        cout << "Previous Information :" << endl;
        sb.printInf();
        Employer boss("BidBoss");
        cout << "Updated Information :" << endl;
        boss.editEmployee(sb, 12.3, "b");
        sb.printInf();
        return 0;
    }
    
    //希望能帮到大家,省下一些时间.
    展开全文
  • 无法解决的问题:类中声明,类外定义的成员函数,导致无法访问类中的私有成员函数 去掉using namespace std; 改变#include <iostream>啥的都没用 苍了个天,走过路过的帮个忙? 真的是头大,跟着视频敲代码...
  • //不设置友元的情况,类外的全局函数无法访问私有成员 #include <iostream> #include<string> using namespace std; class building { public: string m_bed; building(string name1, string name2) {...
  • 地址大连市软件园路80号 E-mail : dutp@ URLhttp://www.dutp,cn 友元函数和友元类 友元函数和友元类 类具有封装性和隐藏性只有类的成员函数才能访问该类的私有成员而程序中的其它函数是无法访问的类中私有成员的它们...
  • 友元函数

    2017-04-23 20:00:08
    但是,如果一个函数它是一个类的友元函数,那么这个函数可以在类外访问类的全部成员,包括私有成员。 友元的语法与特点: 1.友元函数用friend关键字声明,且friend关键字只出现在声明处; 2.友元函数不是类的成员...
  • 只有类的成员函数才能访问类的私有成员,程序中的其他函数无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特...
  • 友元函数和友元类

    2019-09-26 21:47:16
    对于私有成员,在类的外部,一般情况下是无法访问的。 但有的时候,又希望在类外能够访问类的私有成员友元函数就能够实现在类外访问类的成员。 友元函数: 在类内部声明,需要加上关键字friend。 在类外实现...
  • 声明为友元函数之后,友元函数便可访问类中的私有成员。 2.友元函数没有隐藏的this指针,故参数列表中要多一个类的参数,相当于this指针,但是不一定为第一个参数,这使得友元函数的操作更加灵活,能够完成一些成员...
  • c++ 友元函数 友元类

    2017-04-04 22:50:56
    只有类的成员函数才能访问类的私有成员,程序中的其他函数无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是...
  • 只有类的成员函数才能访问类的私有成员,程序中的其他函数无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是...
  • C++友元函数、友元类

    2021-02-03 14:36:40
    只有类的成员函数才能访问类的私有成员,程序中的其他函数无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,在某些情况下,特别是在对某些...
  • c++友元函数友元类

    2017-08-03 17:19:00
    只有类的成员函数才能访问类的私有成员,程序中的其他函数无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是...
  • C++—友元函数

    2017-03-07 15:15:31
    C++友元函数 友元函数是什么呢?顾名思义“友元”,朋友的元素,那么大家都可以共享啦,这也就是友元的作用。 在C++中友元函数允许在类...只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问 私有成
  • c++友元函数与友元类

    2019-10-01 07:25:40
    只有类的成员函数才能访问类的私有成员,程序中的其他函数无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是...
  • c++ 友元函数

    2019-11-16 15:01:21
    c++中的友元函数作用是破坏了类的封装性,在类的内部的成员函数中,可对类的私有属性进行访问与修改,但是在类的外部,如果属性是private, 就无法对其进行修改。 但是, 友元函数能够破坏类的封装性,在全局函数中...
  • C++友元函数和友元类

    2019-01-26 17:58:45
    我在Test类里面定义了一个函数brint()需要访问student的里面的私有成员,然后在student里面声明了友元函数,但是只有在把Test的定义放在student的定义之前才不会报错,放在后面就会报错(无法访问私有成员),无论...
  • C++远征之友元函数篇<->

    千次阅读 2016-10-17 09:48:05
    相信大家都会有点小疑问?何为友元函数难道是friend?那么他又是怎样定义的呢?...否则私有成员无法被外部直接访问的,而友元可以被定义为友元函数和友元类,即指定某函数或类直接访问私有类。则具体形式如下:

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 178
精华内容 71
关键字:

友元函数无法访问私有成员