如何制作一个 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 对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作一个快速的类对象数组的深层副本

Laravel 如何制作一个处理对象数组的 POST?

如何正确制作带有模板数组的类对象?

如何制作具有有限值的对象数组

如何从 CRect 中的数据创建 CBitmap 对象?

制作一个 SIZE = 10 个员工对象的数组 [重复]