【问题标题】:overloading operator++ for a pointer为指针重载 operator++
【发布时间】:2018-12-26 04:46:59
【问题描述】:

我需要遍历一个包含我自己定义的类型的内存区域:

struct ModuleList 
{
    char ModuleName[64];
    int32_t NumberOfFunctions;

};

struct FunctionList
{
    char FunctionName[64];
    DWORD FunctionAddress;
};

这些在内存中的布局如下:

0: ModuleList[0]
0 + sizeof(ModuleList): FunctionsList[NumberOfFunctions]
0 + sizeof(ModuleList)+ NumberOfFunctions * sizeof(FunctionList): ModuleList[1]
.
.
.

我想要做的是,为 ModuleList* 重载运算符 ++,这样我就可以轻松正确地增加我的指针,因为指针的默认 ++ 运算符只增加 sizeof(ModuleList) 而我想增加 sizeof(ModuleList)和函数的大小(即 NumberOfFunctions * sizeof(FunctionList))。内存中的这些结构是完全动态的,我的程序通过网络获取。 目前,我正在这样做:

unsigned short ModuleCount = 0;
BYTE* pTemp = (BYTE*)MemoryAdr;
for (; std::string(((ModuleList*)(pTemp))->ModuleName).find(".dll") != std::string::npos; pTemp += ModuleListSize + ((ModuleList*)(pTemp))->NumberOfFunctions * FunctionListSize)
    ModuleCount++;

但我认为它看起来很丑。有什么建议吗?

【问题讨论】:

  • 您不能为原始指针重载运算符 - 您必须创建一个智能指针类。
  • 我不打算粉饰这一点:重载自定义指针别名的增量运算符会以某种方式为您的代码带来 clarity?我们如何老派它并在循环中遍历结构,记录您在此过程中实际所做的事情,而不是试图滥用一个不会做任何事情但进一步混淆代码的功能(如果它有效,它不会)。
  • 您可以通过添加void next() 或类似于ModuleList 的方法来提高可读性,并在您的循环中调用它
  • 使用单个指针(智能或原始指针)迭代异构内容没有意义。
  • 部分,我认为问题在于术语。如果你称它为迭代器,那么我们都会很高兴。迭代器是一个可以在某些方面像指针一样使用的对象,如果你遵循这种模式,我认为你可以以合理的清晰度做你想做的事。

标签: c++


【解决方案1】:

C++ 要求您的运算符重载至少采用一个“类类型”或枚举类型的操作数。因此,您不能为内在/POD 类型重载运算符,您需要使用自制的智能指针类包装您的结构(正如 Neil 建议的那样)。

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多