什么是 C++ 中的资源?

What is a resource in C++?

提问人:Built on Sin 提问时间:2/12/2016 最后编辑:CommunityBuilt on Sin 更新时间:3/16/2016 访问量:2785

问:

关于这个话题:什么是复制和交换成语?

它指出一个类最多只能处理一个资源。资源是什么意思?

编辑:例如,我有一个类来处理每个显示器的信息,并包含桌面像素数组。数组和只有数组是否被视为资源?保存监视器信息的监视器数组和桌面像素数组是另一个资源,需要另一个类吗?它在另一个班级,但这就是这个意思吗?

我在这里和谷歌上搜索过,但只找到了与三法则或资源文件(*.rc 和 MSDN)有关的更多信息。与定义无关。

C++ Windows WinAPI 资源 法则

评论

0赞 Daniel A. White 2/12/2016
该答案提到了一个指针。
0赞 Ryan T. Grimm 2/12/2016
通常,此上下文中的资源是指文件句柄或堆分配指针之类的内容。另一方面,我认为资源文件是一个 Windows 概念。
0赞 Built on Sin 2/12/2016
@DanielA.White 所以我应该为每个指针创建一个单独的类吗?这似乎有点过分,我不确定你的回答是否有帮助。我知道答案提到了一个指针和一个与简单数组相关的变量(通过指针)。我已经读了十几遍了。
0赞 Daniel A. White 2/12/2016
不可以,您将为每个指针创建一个实例。
1赞 Jonathan Potter 2/12/2016
由于您已经为 windows/winapi 标记了此内容,因此您应该知道术语“资源”在 Win32 中具有特定含义,即链接到可执行模块的二进制数据(字符串、对话框模板、位图等)。如果您感兴趣的是更通用的概念,您可能应该删除这些标签。

答:

1赞 Jts 2/12/2016 #1

资源,例如:需要删除(这就是为什么我们有像 , 这样的智能指针),需要正确关闭的文件(这就是我们有 ),(管理原始句柄,否则您必须在不同的操作系统中管理自己)。 管理引用...等等。您可能已经注意到,它们都管理一个资源,而不是更多。raw pointersstd::unique_ptrstd::shared_ptrstd::fstreamstd::threadstd::reference_wrapper

这个想法是,你不希望一个人为你管理 2 个指针。您将为每个原始指针创建两个类。unique_ptrunique_ptr

对于您编辑的特定问题,通常您要做的是:

创建一个管理所有监视器的类(这是他的任务)MonitorsManager

创建一个类(用于管理单个监视器信息和像素MonitorInfo

如果你有一个好的设计,你会注意到事情会变得更容易,因为将来你会希望能够轻松地编辑和更新这些类,如果你混合所有东西,这将是非常困难的,相信我。

此外,你的类不应该有任何依赖关系,因为如果人们必须在他们的项目中包含类“MonitorsManager”才能使用你的“”类,那么你就失败了。并非每个人都有多个显示器,有些人可能只有一个。MonitorInfoMonitorsManagerMonitorInfo

6赞 andlabs 2/12/2016 #2

这个问题指的是一般的C++概念。在这种情况下,它还使用了“资源”的一般概念:代码块使用的对象,通常是外部的,由外部源提供。它与现实生活中的“资源”相同。

在复制和交换的情况下,它指的是你的 C++ 类所代表的内容。这个想法很简单:C++类的每个实例都将提供对给定资源的访问。例如,让我们在磁盘上获取一个文件。资源就是文件;操作系统提供对该文件的访问。C++ 类将围绕操作系统的 API 调用来读取和写入该文件。

您链接的问题是询问如何将这些类与 C++ 的初始化规则混合。你如何遵循这些规则将取决于外部资源允许你使用什么访问以及你个人需要做什么。

当然,您的程序也可以拥有自己的资源。例如,将一种枚举类型映射到另一种枚举类型的全局数组可能是程序中的资源。因此,对于“我的程序中应该是什么资源”的问题,答案是“这实际上取决于你如何编写程序”。


Windows 程序也有自己的“资源”,例如位图、图标、对话框控件布局、菜单布局、本地化字符串和其他内容。为了允许将这些内容嵌入到输出二进制文件中,Windows 提供了自己的系统,并调用所有这些“资源”。.rc 文件只是列出所有这些 Windows 资源的方式;您可以将其内置到您的 Windows 程序中。

GLib(GTK+建立在它之上)、Qt和各种Apple API都有自己的类似系统,每个系统的名称中都有“资源”。

(您也可以编写C++类来提供对所有这些特定资源的访问;在本例中,资源就是资源。

但是,在阅读时,不要将通用术语(“资源”)与特定技术(Windows资源)混淆,反之亦然,这一点非常重要,尤其是对于资源这样的抽象概念。在继续编程之旅时,请记住这一点。