提问人:Jakub Chomicz 提问时间:1/19/2022 更新时间:1/19/2022 访问量:41
同一命名空间中的友元类
Friend classes in the same namespace
问:
我正在编写基于 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
答:
1赞
Jarod42
1/19/2022
#1
您可能在外部使用构造函数/析构函数(如在或默认中)。Azazel_Menager
std::make_shared
Deleter
您必须在 中专门使用它们,因为: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
好的,谢谢你的帮助,我会这样做的,我猜
评论