c ++在构造函数中传递数组而不在别处定义它们

时间:2018-03-08 18:24:20

标签: c++ arrays constructor

我目前有这段代码:

#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}

2 个答案:

答案 0 :(得分:3)

您应该使用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

答案 1 :(得分:3)

这个构造函数是错误的

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分配的字节数被泄露。

在析构函数中,您假设先前已使用new []分配offsetArray并将其传递给构造函数,但是您的类的用户将如何知道?

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

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

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

在C ++中使用数组时,使用std::arraystd::vector,然后创建一个更透明,更干净的设计 - 请参阅Kilzone Kids的回答。