如何制作一个 CRect 对象数组?
Posted
技术标签:
【中文标题】如何制作一个 CRect 对象数组?【英文标题】:How to make an array of CRect objects? 【发布时间】:2012-09-03 11:18:27 【问题描述】:我想在头文件中定义一个CRect
对象数组。那么会不会是这样的:
#pragma once
#include<atltypes.h>
CRect blockPos[3] = CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), ;
【问题讨论】:
我正在尝试了解需求。元素是否仅在某个类的上下文中有意义,并且元素不会改变的意图?如果是这样,类的静态 const 成员可能就是您真正需要的。 【参考方案1】:如果数组是常量,那么你可以简单地在标题中声明数组const
:
CRect const blockPos[3] = CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), ;
这确实意味着包含标头的每个翻译单元都会生成自己的副本,如果数组非常大,这可能并不理想。
如果它不是常量,或者您想避免多次复制,那么您将需要对整个程序进行一个定义,并且只需要在标题中声明:
// header
extern CRect blockPos[3];
// some source file
CRect blockPos[3] = CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), ;
在这种情况下,请注意静态初始化顺序失败。没有指定何时相对于其他翻译单元中的全局变量初始化它,因此如果另一个全局变量的构造函数尝试访问它,您的程序可能具有未定义的行为。一般来说,全局变量充满了危险,所以使用它们时要格外小心。
【讨论】:
请注意,在这种情况下,可以通过使用 Win32 数据类型RECT
(它只是 POD)而不是 MFC 类型 CRect
来避免静态初始化顺序失败。【参考方案2】:
您不应在头文件中定义变量,因为它将在包含头文件的站点上多次定义。您应该改用访问器方法:
头文件
#pragma once
CRect* GetRectArray();
C++ 文件
#include "MyHeader.h"
namespace
CRect blockPos[3] = CRect(0,0,55,43), CRect(0,0,55,43), CRect(0,0,55,43), ;
CRect* GetRectArray()
return blockPos;
【讨论】:
您仍然可以在头文件中将变量声明为外部变量,并在代码中的其他位置定义它。 你可以,但我使用的是更多的 C++ 方法,基于他使用 MFC 的示例。 为什么要放在命名空间中? 顺便说一下,这个数组的元素将是const
,因为它们实际上是在客户区绘制的一些矩形的位置。那么,是否有更好、更有条理的方式来定义它,同时牢记目的?
这里的命名空间是匿名命名空间,建议不要使用static关键字。以上是关于如何制作一个 CRect 对象数组?的主要内容,如果未能解决你的问题,请参考以下文章