【问题标题】:c++ passing arrays in constructor without defining them elsewherec++ 在构造函数中传递数组而不在其他地方定义它们
【发布时间】:2018-03-08 18:24:19
【问题描述】:

我目前有这个代码:

#include "stdafx.h"
#include "AddressInfo.h"

AddressInfo::AddressInfo(int ammoCount, int pointerLevel, DWORD baseAddress, DWORD* offsetArray) {
    ammo = ammoCount;
    numPointers = pointerLevel;
    this->baseAddress = baseAddress;
    offsets = (DWORD*)malloc(sizeof(offsetArray));
    this->offsets = offsetArray;
};

AddressInfo::~AddressInfo() {
    delete[] offsets;
}

void AddressInfo::print() {
    std::cout << this->offsets[0]<< std::endl;
}





DWORD x[] = { 0x374, 0x14, 0x0 };
AddressInfo* ammo = new AddressInfo(1000, 3, (DWORD)(0x00509B74), x);

int main()
{
    ammo->print();
    system("pause");
}

此代码有效,但我想执行以下操作: 我不想预先定义数组并将其传递给构造函数,而是按如下方式传递数组:{0x374,0x14,0x0}

这可能吗/这实用吗

我尝试过类型转换:(DWORD*) {0x374,0x14,0x0}

【问题讨论】:

  • { x, y, ...} 符号仅在分配时有用。我不认为它可以在函数调用中使用。
  • 使用std::vector
  • 如果您使用的是 C,这可能是复合文字。
  • offsets = (DWORD*)malloc(sizeof(offsetArray)); 结合 delete[] offsets; 根本无法工作
  • @UnholySheep 分配 this-&gt;offsets = offsetArray 甚至在它到达之前就破坏了它。

标签: c++ arrays constructor


【解决方案1】:

您应该将std::vector 用于此任务和未来的任务。看看它让一切变得多么简单和干净

#include <iostream>
#include <vector>

class AddressInfo
{
    int ammoCount;
    int pointerLevel;
    std::vector<uint32_t> offsets;

public:
    AddressInfo(int ammoCount, int pointerLevel, std::vector<uint32_t> offsets) :
        ammoCount{ ammoCount }, pointerLevel{ pointerLevel }, offsets{ offsets }
    {   
    }

    void print(size_t i) 
    {
        std::cout << this->offsets.at(i) << std::endl;
    }
};

int main() 
{
    AddressInfo ammo (1000, 0x00509B74, { 0x374, 0x14, 0x0 });
    ammo.print(0);
    ammo.print(1);
    ammo.print(2);

    return 0;
}

https://ideone.com/WaLiP8

【讨论】:

    【解决方案2】:

    这个构造函数是错误的

    AddressInfo::AddressInfo(
      int ammoCount, 
      int pointerLevel, 
      DWORD baseAddress, 
      DWORD* offsetArray) 
    {
      ammo = ammoCount;
      numPointers = pointerLevel;
      this->baseAddress = baseAddress;
      offsets = (DWORD*)malloc(sizeof(offsetArray));
      this->offsets = offsetArray;
    };
    

    首先你使用 malloc 进行分配,在 C++ 中我们通常使用 new,因为 malloc 不调用任何构造函数。第二个 sizeof 没有给出数组的大小,它给出了指针的大小 - 它与写 sizeof(DWORD*)

    然后在你为offsets 分配了指向的东西之后,你让它指向参数,这样你用 malloc 分配的字节就会泄露。

    在您的析构函数中,您假设 offsetArray 之前已经分配了 new[] 并传递给了构造函数,但是您的类的用户怎么会知道呢?

    想象一下有人使用分配在堆栈上的数组来创建您的 AddressInfo。

    DWORD myArray[10];
    AddressInfo adr = new AddressInfo(ammoCount,pointerLevel,baseAddress,offsetArray);
    

    人们不想查看实现来寻找假设,这就是将东西放在类中以隐藏实现的整个想法。

    当您在 C++ 中处理数组时,请改用 std::arraystd::vector,然后创建一个更加透明和简洁的设计 - 请参阅 Kilzone Kids 的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多