2

刚刚阅读了朋友函数,我正在尝试使用 B 类的朋友函数“打印”访问 A 类中的私有变量“数字”。我正在使用 Visual Studio。我的代码的编译给了我很多各种各样的错误,比如:

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

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

这是我的文件啊:

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;
}

乙:

#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;
}

主.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();
}
4

2 回答 2

3

...其次,您可能需要B在头文件中对类进行前向声明以作为朋友A.h引用:B

#ifndef _A_H_
#define _A_H_
class B;

class A
{
     friend class B;
};
#endif

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

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

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

于 2012-12-14T19:25:57.327 回答
1

首先你需要把

#ifndef A_H
#define A_H
.... your A-class definition
#endif

在你的 Ah 和 Bh 中类似,这样就可以防止同一文件的多个包含(这是你的重复定义错误)......

于 2012-12-14T19:14:10.197 回答