同一命名空间中的友元类

Friend classes in the same namespace

提问人:Jakub Chomicz 提问时间:1/19/2022 更新时间:1/19/2022 访问量:41

问:

我正在编写基于 Vulkan 的渲染器,但不幸的是出现了此错误:“Azazel::Instance::~Instance”:无法访问在类“Azazel::Instance”中声明的私有成员这让我头疼。我试图在我的命名空间的开头预先声明Azazel_Menager类, 但它效果不佳,所以我改变了:

friend class Azazel_Menager;

自:

friend class Azazel::Azazel_Menager;

好吧,它也没有奏效。所以在这里,我请求你的帮助。 也许你会看到一些我没有的东西。

Azazel_Menager:

#pragma once
#include "Engine/Core/UsingTypes.h"
namespace Azazel
{
    class Instance;
    class PhysicalDevice;

    class Azazel_Menager
    {
    public:
        static void CreateInstance();
        static void RetrieveAndSetPhysicalDevice();
    private:
        static Ref<Instance> s_Instance;
        static Ref<PhysicalDevice> s_PhysicalDevice;
    };
}

实例.h:

#pragma once
#include <vector>
#include <VulkanSDK/include/vulkan/vulkan.hpp>
namespace Azazel
{
    class Azazel_Menager;
    class Instance
    {
        friend class Azazel::Azazel_Menager;
    private:
        Instance();
        ~Instance();
    public:
        vk::UniqueInstance m_Instance;
        VkDebugUtilsMessengerEXT m_callback;
    };
}

引用 = std::shared_ptr

C++ 友类

评论

2赞 molbdnilo 1/19/2022
请阅读最小可重现示例。(所有 Vulkan 的东西都与该问题无关。

答:

1赞 Jarod42 1/19/2022 #1

您可能在外部使用构造函数/析构函数(如在或默认中)。Azazel_Menagerstd::make_sharedDeleter

您必须在 中专门使用它们,因为:Azazel_Menager

void Azazel_Menager::CreateInstance()
{
    s_Instance = std::shared_ptr<Azazel::Instance>{new Azazel::Instance{},
                                                   [](auto* p){ delete p; }};
}

演示

评论

0赞 Jakub Chomicz 1/19/2022
谢谢,奏效了!但是我调试了一下,注意到我现在从不调用实例的析构函数。我现在应该为它制作一个新函数还是什么?
0赞 Jarod42 1/19/2022
从给定的代码中,当全局被销毁时,应调用析构函数(之后)。main
0赞 Jakub Chomicz 1/19/2022
好吧,这不是我真正想要的。是否可以在 idk 静态类Azazel_Menager 中调用析构函数,例如 shutdown ?
0赞 Jarod42 1/19/2022
您可以手动重置。std::shared_ptr
0赞 Jakub Chomicz 1/19/2022
好的,谢谢你的帮助,我会这样做的,我猜