一个C++问题。。。问过无数的群都没人知道。。有那么难吗??求高手!!

如题所述

在定义A的时候B类未定义,因此友元声明是非法的。

必须先定义B,为了定义B必须加A类的前向引用声明。

结果如下:

class A;
class B
{
public:
 void setA(A& a);
};
class A
{
 int x;
 friend void B::setA(A&);
};

还有用于测试的main:

int main()
{
 B b;
 A a;
 b.setA(a);
 return 0;
};

你只看到编译器画的红线是没用的,VS2010的即时语法检查效果很差,必须看编译的结果。你编译一下就知道你上面程序的错误不是从那开始的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-16

错误不在 friend function:

 

#include <iostream>
using namespace std;

char* szt="1234";
#include <string.h>


class A;

class B{
//friend class A;
public: void SetValue(A&a); 
};

class A{
int x;
friend void B::SetValue(A&a);
public: int getX(){ return x; };
};


void B::SetValue(A&a){
a.x=9;
}


void main(){
A a; B b;
cout<<"a.x="<<a.getX()<<endl;
b.SetValue(a);
cout<<"After B::SetValue, a.x="<<a.getX()<<endl;


return;

}

第2个回答  2013-07-16
1 编译的时候A、B两个类按照前后顺序,没有定义的需要先声明。这和自定义函数和主函数先后编译是一样的,可以在主函数前添加声明,然后在主函数后面再实现。
2 如果你不声明 public这些,变量或者函数自动定义成private类型,自己平时的时候养成好习惯的好
3 友元函数,原来可以是类的成员函数(友元成员函数),也可以是自定义函数(友元函数)

4 你那个主要问题在于类和对象的概念没有搞清楚。
类就是一个结构,需要对象才能实现,才能起作用,如果在main函数里面A B类声明对象,也就相当于类方法根本都没有实现。
类像一个军师,策略已经写好了,但是不能打仗执行,没有派出士兵执行策略,自然无法实现。

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <IOSTREAM>

using namespace std;

class A;

class B
{
public:
void SetValue(A &a);
};

class A
{
private:
int x;
public:

friend void B::SetValue (A &a); //友元成员函数
friend void DisplayValue (A &a); //友元函数
};

void B::SetValue(A &a)
{
a.x=58;
}

void DisplayValue(A &a)
{
cout<<"A对象的私有变量设置值为"<<a.x;
}

int main()
{
A a;
B b;
b.SetValue(a); //调用友元成员函数
DisplayValue(a); //调用友元函数
system("pause");
return 0;
}
第3个回答  2013-07-16
注意友元函数不可以是类的成员函数,友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号。
不过你可以在A的定义中加上friend class B;来声明B是A的友元类,友元类的所有成员函数都可以访问本类的私有成员。
第4个回答  2013-07-16
因为在类中要声明为public才行,不声明的话,默认是私有的。追问

又一个这样说的。。。。

第5个回答  2013-07-16
你没先声明,编译器不认识。
相似回答
大家正在搜