包含类中的头文件,它是一个朋友

问题描述 投票:6回答:2

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

class Class2 {
   friend class Class1;
}

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

c++ class friend
2个回答
10
投票

语法是:

friend class Class1;

而且不,您不包括标题。

[一般来说,除非您实际上以某种方式使用了类定义(例如,您使用该类的一个实例并且编译器需要知道其中的内容),否则您不需要包括标头。如果您只是按名称指代课程,例如您只有一个指向该类实例的指针,并且将其传递给其他对象,那么编译器无需查看类定义-只需声明它就足以告诉该类:

class Class1;

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


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

class X;

class Y
{
    X *x;
};

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

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


0
投票

否,您必须not必须在将其用作朋友的类中“ #include“ Class1.h”。”您甚至都不必向前声明class Class1的存在(尽管accepted answer表示您确实存在)。您只需要在Class2的定义内声明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

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

private:
    Class2 _class2;
};

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

    Class1 class1;

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

    return 0;
}

输出:

你好世界class1.getClass2Int()= 123

© www.soinside.com 2019 - 2024. All rights reserved.