| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 659 人关注过本帖
标题:关于友元函数的实现的菜鸟问题!
只看楼主 加入收藏
lycpp
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-7-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
关于友元函数的实现的菜鸟问题!
#include<iostream>
using namespace std;
class Y;
class Z;
class X
{
public:
    X(int a=0){i=a;}
    int geti(){return i;}
    friend Z;
    friend void Y::g(X*);
    friend void h(X*);
private:
    int i;
};
class Y
{
public:
    Y(int b=1){k=b;}
    void g(X*x1)
    {
        x1->i=x1->i+k;
    }
private:
    int k;
};
class Z
{
public:
    Z(int c=5){t=c;}
    void f(X*x2)
    {
        x2->i=x2->i+c;
    }
private:
    int c;
};
void h(X*x3)
{
    x3->i=x3->i+10;
}

关于这段代码vc6.0编译时提示有一个错误:error C2027: use of undefined type 'Y'
                                                      see declaration of 'Y'
请问如何修改?谢谢了!
搜索更多相关主题的帖子: 函数 
2010-07-28 14:07
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:20 
你上面的声明class Y没有完整定义,所以这里就不能使用friend void Y::g(X*)这样的声明。只能把Y作为X的友元。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-28 15:32
lycpp
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-7-28
收藏
得分:0 
#include<iostream>
using namespace std;
class Z;
class X
{
public:
    X(int a=0){i=a;}
    int geti(){return i;}
    friend Z;
    friend void g(X*);
    friend void h(X*);
private:
    int i;
};
class Y
{
public:
    Y(int b=1){k=b;}
    void g(X*x1)
    {
        x1->i=x1->i+k;
    }
private:
    int k;
};
class Z
{
public:
    Z(int c=5){t=c;}
    void f(X*x2)
    {
        x2->i=x2->i+c;
    }
private:
    int c;
};
void h(X*x3)
{
    x3->i=x3->i+10;
}

如果我对g(X*)的申明做出修改,并取消了对Y的前向引用声明,那程序如上。
这样编译器还是会提示出错:error C2248: 'i' : cannot access private member declared in class 'X'
这又是怎么回事?如果一定要把Y声明为X的友元才能实现g(X*)应有的功能。那为什么我们教科书上有这样一段话:“友元函数不仅可以是一个普通函数,也可以是另外一个类的成员函数。友元成员函数的使用和一般友元函数的使用基本相同,只要通过相应的类或对象名来访问。”这如何才能实现?
2010-07-28 19:57
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
程序代码:
#include<iostream>
using namespace std;

class X;       //前置声明

void h(X*);   //全局函数声明  

class Y                   //Y类型声明
{
public:
    Y(int b=1){k=b;}
    void g(X*x1);  
private:
    int k;
};

class X                   //X类型声明
{
public:
    X(int a=0){i=a;}
    int geti(){return i;}
   
    friend void Y::g(X*x1);   //类成员函数友元
    friend void h(X*);        //全局函数友元
private:
    int i;
};

void h(X* x1)                //全局函数实现
{
    x1->i = 33;
}

void Y::g(X*x1)             //类函数实现
{
    x1->i += k;
}

int main(int argc,char* argv[])
{
    X pc1(5);
    Y pc2(11);

    h(&pc1);               //调用演示
    pc2.g(&pc1);

    return 0;
}


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-29 11:00
lycpp
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2010-7-28
收藏
得分:0 
真是太感谢了!
2010-07-29 12:17
快速回复:关于友元函数的实现的菜鸟问题!
数据加载中...
 
   



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

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