在包含朋友的类中包含头文件

时间:2012-04-11 20:23:20

标签: c++ class friend

我想知道你是否必须在一个使用它作为朋友的类中使用#include“Class1.h”。例如,授予Class1类权限的类的.h文件。

class Class2 {
   friend class Class1;
}

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

2 个答案:

答案 0 :(得分:8)

语法为:

friend class Class1;

不,你不包括标题。

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

class Class1;

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


要回答加里的评论,请注意这个编译并链接正常:

class X;

class Y
{
    X *x;
};

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

除非您实际使用X中的内容,否则无需提供X的定义。

答案 1 :(得分: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;

这是一个完整的可行示例。您可以run and test it here(注意,运行此示例时有2个选项卡-每个文件一个)。

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

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

输出:

Hello World
class1.getClass2Int()= 123
class1.getClass2Int()= 700

参考:

  1. https://www.geeksforgeeks.org/friend-class-function-cpp/
  2. Google搜索"do you need to include header file to declare friend class?"
  3. Including header file in class that is a friend