| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2078 人关注过本帖
标题:为什么友员函数报错不能访问私有成员???
只看楼主 加入收藏
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
 问题点数:0 回复次数:13 
为什么友员函数报错不能访问私有成员???

class add
{
public:
add(){}; //构造函数1
add(const char [100]); //构造函数2
void show(); //输出私有字符串变量a
friend add operator + (const add &,const add &); //友员重载+
private:
char a[100]; //
};

//两个构造函数
add::add(const char s[100])
{strcpy(a,s);}

void add::show()
{cout<<'\"'<<a<<'\"';}


//两个友员函数
add operator + (const add &a,const add &b)
{
add temp(a.a);
strcat(temp.a,b.a);
return temp;
}

为什么友员函数报错不能访问私有成员???

VC++6.0中!

搜索更多相关主题的帖子: 函数 成员 访问 
2007-04-21 14:59
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 

为什么我试了一下却可以访问呢?
#include <iostream.h>
class T
{
public:
T(char c):bit(c)
{}
friend T operator+(T& a,T& b)
{
T temp(a.bit); //这里可以
return T((a.bit+b.bit)%127);
}
friend ostream& operator<<(ostream& os, T& a)
{
os<<a.bit; //这里也可以
return os;
}
private:
char bit;

};
int main()
{
T a('a');
T b('b');
cout<<a+b<<endl;
return 0;
}
两个程序应该是一样的


try new catch
2007-04-21 16:39
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 

你把声明和定义分开试试!


Fight  to win  or  die...
2007-04-21 16:50
fat_june
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-4-3
收藏
得分:0 
回复:(aipb2007)为什么友员函数报错不能访问私有成...

呵呵~这个程序其实是我写的……现在修改了一下

虽然写得不好,但是应该能运行才对啊……但是就是说:cannot access private member declared in class 'add'

不知道怎样解决了

//友员函数实现字符串连接

#include <iostream>
#include <string>
using namespace std;

//类add
class add
{
public:
add(){} //构造函数1
add(char s[100]) {strcpy(a,s);} //构造函数2
void show() {cout<<'\"'<<a<<'\"';} //输出私有字符串变量a
friend add operator + (add &,add &); //友员重载+
private:
char a[100];
};


//友员函数
add operator + (add &a,add &b)
{
/*//这个也不行
add temp=a;
strcat(temp.a,b.a);
return temp;
*/
strcat(a.a,b.a);
return a;
}


/****************** main ******************/
int main()
{
//input
char s[100]={0};
cout<<"Input the first string:\t\t";
cin>>s;
add ad1(s);
cout<<"Input the secontd string:\t";
cin>>s;
add ad2(s);

//add
add sum=ad1+ad2; //调用重载函数

//output
cout<<endl;
ad1.show();
cout<<'+';
ad2.show();
cout<<'=';
sum.show();
cout<<endl;

return 0;
}

2007-04-21 17:08
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 

仍然可以
//////////////test.h////////////////
#include <iostream.h>
class T
{
public:
T(char c):bit(c)
{}
friend T operator+(T& ,T& );
friend ostream& operator<<(ostream& os, T& a)
{
os<<a.bit; //这里也可以
return os;
}
private:
char bit;

};
//////////////a.h//////////////////
#include "test.h"
T operator+(T& a,T& b)
{
T temp(a.bit);
return T((a.bit+b.bit)%127);
}
///////////////main//////////////
#include "a.h"
int main()
{
T a('a');
T b('b');
cout<<a+b<<endl;
return 0;
}


try new catch
2007-04-21 17:20
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
楼上的用的VC++6.0?

我在VC++6.0上编译时报错

你再改下,都写在一个文件里,只是把友元重载写在类外面。

呵呵

Fight  to win  or  die...
2007-04-21 17:23
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 
aipb2007 你的VC++6.0 没有打sp6补丁吧 ...

在类定义的前面 加上几个声明试试

class T;
T operator+(T& ,T& );
ostream& operator<<(ostream&, T&);

unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-21 18:57
fat_june
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-4-3
收藏
得分:0 
真不明白~~~~~~
在DEV-CPP里没问题的,VC6.0就出现问题了

后来我把using namespace std; 注释掉,头文件加上".h",就可以了……

不知道什么原因,编译器版本问题?
2007-04-21 19:55
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
以下是引用游乐园在2007-4-21 18:57:50的发言:
aipb2007 你的VC++6.0 没有打sp6补丁吧 ...

在类定义的前面 加上几个声明试试

class T;
T operator+(T& ,T& );
ostream& operator<<(ostream&, T&);

我记的我安装的那个VC就是sp6啊!

在哪里有SP6的补丁?大哥给我个撒!


Fight  to win  or  die...
2007-04-21 20:02
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 
  我也没有 ...现在都是集成sp6的VC++了  ,单独的不再提供下载了 连微软官方网站上也提供到sp5

unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-04-21 20:17
快速回复:为什么友员函数报错不能访问私有成员???
数据加载中...
 
   



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

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