6

我想知道您是否必须在将其用作朋友的班级中#include“Class1.h”。例如,授予 Class1 类权限的类的 .h 文件。

class Class2 {
   friend class Class1;
}

你需要#include“Class1.h”还是没有必要?同样在 Class2 类中,从未创建或使用 Class1 对象。Class1 只是操纵 Class2 而不是相反。

4

2 回答 2

11

语法是:

friend class Class1;

不,你不包括标题。

更一般地说,您不需要包含标头,除非您实际上以某种方式使用类定义(例如,您使用类的实例并且编译器需要知道其中的内容)。如果您只是通过名称引用类,例如您只有一个指向该类实例的指针并且您正在传递它,那么编译器不需要查看类定义 - 告诉它就足够了通过声明该类:

class Class1;

这很重要,有两个原因:次要的原因是它允许您定义相互引用的类型(但您不应该!);主要的一点是它允许您减少代码库中的物理耦合,这有助于减少编译时间。


要回答 Gary 的评论,请注意编译和链接很好:

class X;

class Y
{
    X *x;
};

int main()
{
    Y y;
    return 0;
}

除非您实际使用 X 中的某些东西,否则无需提供 X 的定义。

于 2012-04-11T20:25:09.147 回答
1

不,您不必 #include "Class1.h" 在将其用作朋友的班级中。” 您甚至不必转发声明两者的存在class Class1。您只需在 Class2 的定义中声明 Class1 为友元即可!(我认为该friend class Class1声明本身就是一种“前向声明” Class1):

// Inside the definition of Class2, place this (usually
// at the very bottom inside the `private:` section)
friend class Class1;

这是一个完整的工作示例。您可以在此处运行和测试它(请注意,运行此示例时有 2 个选项卡——每个文件一个)。

类2.h

#pragma once 

class Class2
{
private:
    int _myInt = 123;

    // Declare Class1 as a friend class to Class2 so that Class1 can access all of Class2's private
    // and protected members (as though Class2's members were part of Class1)
    friend class Class1;
};

主.cpp

#include "Class2.h"

#include <stdio.h>

class Class1
{
public:
    int getClass2Int()
    {
        return _class2._myInt;
    }

    void setClass2Int(int val)
    {
        _class2._myInt = val;
    }

private:
    Class2 _class2;
};

int main()
{
    printf("Hello World\n");

    Class1 class1;

    printf("class1.getClass2Int() = %i\n", class1.getClass2Int());
    class1.setClass2Int(700);
    printf("class1.getClass2Int() = %i\n", class1.getClass2Int());

    return 0;
}

输出:

你好世界
class1.getClass2Int() = 123
class1.getClass2Int() = 700

参考:

  1. https://www.geeksforgeeks.org/friend-class-function-cpp/
  2. 谷歌搜索“你需要包含头文件来声明朋友类吗?”
  3. 在作为朋友的类中包含头文件
于 2020-03-31T23:49:13.320 回答