小编mbl*_*mbl的帖子

什么是C中的编译时封装?

当我研究C相对于C ++的优势时,遇到了这一段:

用C进行封装的标准方法是转发声明一个结构,并且仅允许通过函数访问其数据。此方法还会创建编译时封装。编译时封装使我们能够更改数据结构成员,而无需重新编译客户端代码(使用我们接口的其他代码)。另一方面,进行封装C ++的标准方法(使用类)要求在添加或删除私有成员变量时重新编译客户端代码。

我了解如何通过函数声明结构并访问其成员如何隐藏该结构的实现细节。我不明白的是这条线是:

编译时封装使我们能够更改数据结构成员,而无需重新编译客户端代码(使用我们接口的其他代码)。

在什么情况下适用?

c

9
推荐指数
1
解决办法
246
查看次数

如何从 WinRT 中的接口 ID (IID) 找出类名称?

我有一个基于 BlankApp 模板的 XAML C++/WinRT 应用程序。当我构建应用程序时,我意识到我的应用程序在输出窗口中在幕后抛出了很多异常。我试图理解的例外情况如下:

Exception thrown at 0x00007FFA9EFA9149 (KernelBase.dll) in wzrd_editor.exe: WinRT originate error - 0x80040155 : 'Failed to find proxy registration for IID: {50F19C16-0A22-4D8E-A089-1EA9951657D2}.'.

我一直在做的是打破 WinRT 引发的错误并查看调用堆栈。但是我想知道如何找出错误中显示的 IID 的类名?了解这些异常的来源似乎非常有用。也许注册表中的某个地方我可以找到?

windows-runtime c++-winrt

5
推荐指数
2
解决办法
1204
查看次数

常量缓冲区和只读结构化缓冲区有什么区别?

我想知道哪种资源类型最适合使用,以便为静态数据保存尽可能多的元素,并且在绘制调用期间不会更改。我能看出常量缓冲区和只读结构化缓冲区之间的唯一区别是常量缓冲区数据必须在其ID3D12Resource对象内部按 256 字节对齐。

lights.hlsl

#define as_many_as_possible 1000

struct light
{
    float3 position;
    float falloff_start;
    float3 direction;
    float falloff_end;
    float3 color;
    float3 strenght;
};

struct light_data
{
    light lights [as_many_as_possible];
};
ConstantBuffer<light_data> cb_lights : register(b0);

// Versus

StructuredBuffer<light> sb_lights : register(s0);
Run Code Online (Sandbox Code Playgroud)

如果我的目标是保存尽可能多的灯光数据,那么哪一个更好?

directx direct3d hlsl directx-12

4
推荐指数
1
解决办法
3064
查看次数

如何在 .IDL 文件中声明枚举?

我有一个运行时类,我想向其中添加一个枚举。我已经按照此处的 MSDN 文档的建议尝试了以下语法:https : //docs.microsoft.com/en-ca/uwp/midl-3/intro

namespace my_project
{
    runtimeclass my_rt_class
    {        
        enum my_enum
        {
            first = 0,
            second = 1
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我从 MIDL 收到以下错误:

error MIDL2025: [msg]syntax error [context]: expecting an identifier near ";"
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?我正在使用10.0.17763.0Windows SDK 的版本。

midl win-universal-app uwp c++-winrt

1
推荐指数
1
解决办法
1781
查看次数

是否有更简洁的方法从返回 wchar_t** 的 API 创建 std::wstring ?

我想std::wstring从 Win32 函数中生成一个GetThreadDescription()函数。

目前,我是这样做的:

wchar_t thread_desc[MAX_PATH];
wchar_t* p = &thread_desc[0];
check_hr(GetThreadDescription(GetCurrentThread(), &p));
std::wstring wthread = std::wstring(p);
Run Code Online (Sandbox Code Playgroud)

然而,这看起来真的很尴尬,我想知道是否有更简洁的方法?

c++ winapi

1
推荐指数
1
解决办法
78
查看次数

包装生成随机数的函数的最简单和最优雅的方法是什么?

函数如下:

float random_float(float min, float max)
{
    std::random_device rd;                                            // obtain a random number from hardware
    std::mt19937 gen(rd());                                           // seed the generator
    std::uniform_real_distribution<> distr((double)min, (double)max); // define the range
    return (float)distr(gen);
}
Run Code Online (Sandbox Code Playgroud)

我想避免每次调用此函数时调用前 3 行。我也不想用构造函数创建一个类,然后每次我只想生成一个随机数时都必须实例化它。我不太熟悉现代 C++ 特性的可能性,所以我想要一些想法。

c++ c++17

-1
推荐指数
1
解决办法
123
查看次数