如何将带数组的struct转换为类?

时间:2014-03-12 10:42:18

标签: c++ arrays class struct

以下是我所拥有的:

void function() {
struct APROCS
{
DWORD PID;
TCHAR processname[256];
};  
static struct APROCS *aProcesses;
aProcesses = (APROCS *) calloc(8192, sizeof(APROCS));    

//do work...
[get PIDs and process names]
if ((aProcesses[i].PID > 4) && (_tcslen(aProcesses[i].processname) > 0
//do more work...    

free(aProcesses);aProcesses=NULL;
}

我希望消除所有不良代码,虽然这段代码有效,但这可能不是正确的方法。我基本上设置了一个aProcesses数组[8192]。我想使用一个类:

// CProcesses.h 
class CProcesses
{
public:
DWORD PID;
TCHAR processname[256];

CProcesses(void);
~CProcesses(void);
};

// CProcesses.cpp   
#include <Windows.h>
#include "CProcesses.h"
CProcesses::CProcesses(void)
{
}
CProcesses::~CProcesses(void)
{
}

我这样做是为了从类中分配一个数组吗?

void function() {
CProcesses *aProcesses[8192];

//do work...
[get PIDs and process names]
if ((aProcesses[i].PID > 4) && (_tcslen(aProcesses[i].processname) > 0
//do more work...  
}

2 个答案:

答案 0 :(得分:2)

  

我希望消除所有不良代码,虽然此代码有效,但这可能不是正确的方法。

那么它有什么问题?需要修复什么。 它不是&#34;坏&#34;只是因为它使用关键字struct而不是class。您无法在不知道为什么它被破坏的情况下修复损坏的代码。

C ++中的struct很简单class,其中成员默认是公开的,而不是私有的。因此,您的替代实现没有任何不同。

你可能会认为代码是&#34;坏&#34;因为它具有calloc的手动内存分配,必须明确释放。如果您在致电callocfree之间抛出异常,则会泄漏内存。

由于这是C ++,为什么不保留进程的struct(在C ++中通常使用struct来获得纯粹的数据块而没有方法)并使用用于管理集合的类?您可以使用std::vector而不是原始数组,也可以编写自己的类来管理内存,在构造函数中分配它并在析构函数中释放它。

使用矢量是最简单的,你不太可能犯错误。

关于载体的主题,尽可能使用STL容器是最安全的。例如尽可能长时间使用std::string而不是charTCHAR数组/指针,只有在需要将其传递给Win32 API时才使用基础char数组

答案 1 :(得分:0)

您可能应该用std :: string替换APROCS :: processname。

如果您的应用程序仅使用TCHAR = char进行编译,则可以使用std :: string。 如果要使用TCHAR = wchar_t进行编译,请考虑使用std :: wstring。

您还应该使用std :: vector替换aProcesses。

这不是强制性的,但可能应该使您的数据在CProcesses中保密,并为其使用访问器(或将其全部保留为具有公共数据的结构。