在C ++中使用友元函数

时间:2012-12-14 19:06:39

标签: c++ class friend friend-class

刚刚阅读有关朋友函数的信息,我正在尝试使用B类中的朋友函数“Print”访问A类中的私有变量“number”。我正在使用Visual Studio。编译我的代码给了我很多错误,如:

  

C2011:'A':'class'类型重新定义
  C2653:'B':不是类或命名空间名称

请耐心等待我并展示实现目标的正确方法。

这是我的档案 A.H:

class A
{
public:
    A(int a);
    friend void B::Print(A &obj);
private:
    int number;
};

A.cpp:

#include "A.h"

A::A(int a)
{
    number=a;
}

B.h:

#include <iostream>
using namespace std;
#include "A.h"
class B
{
public:
    B(void);
    void Print(A &obj);
};

B.cpp:

#include "B.h"

B::B(void){}

void B::Print(A &obj)
{
    cout<<obj.number<<endl;
}

main.cpp中:

#include <iostream>
#include <conio.h>
#include "B.h"
#include "A.h"

void main()
{
    A a_object(10);
    B b_object;
    b_object.Print(A &obj);
    _getch();
}

2 个答案:

答案 0 :(得分:3)

......其次,您可能需要在B标头文件中提及类A.h的前向声明,以便将B称为朋友:

#ifndef _A_H_
#define _A_H_
class B;

class A
{
     friend class B;
};
#endif

<强>更新
我目前不太确定是否可以将成员函数声明为朋友,我会看看。

无法创建成员函数friend声明,您可以将全局函数或整个类声明为朋友,另请参阅:C++ ref, Friendship and inheritance

一般来说,使用friend根本不是一个好的设计理念,因为它强烈地将这些类结合在一起。更好的解决方案是耦合接口(无论如何都不需要公开显示) 在极少数情况下,它可能是一个很好的设计决定,但几乎总是适用于内部细节。

答案 1 :(得分:1)

首先你需要把

#ifndef A_H
#define A_H
.... your A-class definition
#endif
在A.h中类似于B.h,以防止同一文件的多个包含(即您的重复定义错误)...