gpt4 book ai didi

C++动态分配类数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:19 25 4
gpt4 key购买 nike

假设一个 class X 有一个构造函数 X(int a, int b)

我创建了一个指向 X 的指针作为 X *ptr; 来为类动态分配内存。

现在创建一个类 X 的对象数组

 ptr = new X[sizeOfArray];

到目前为止一切都很好。但我想要做的是创建上面的对象数组应该调用构造函数 X(int a, int b)。我试过如下:

ptr = new X(1,2)[sizeOfArray]; 

正如预期的那样,它给了我编译时错误

error: expected ';' before '[' token|

如何创建一个对象数组来调用构造函数?

SizeOfArray 由用户在运行时输入。

编辑:正如天顶所回答的那样,我想要实现的目标是不可能的,否则会太复杂。那么我怎样才能使用 std::vector 呢?

最佳答案

这似乎是 placement new 的工作...

这是一个基本的例子:

Run It Online !

#include <iostream>
#include <cstddef> // size_t
#include <new> // placement new

using std::cout;
using std::endl;

struct X
{
X(int a_, int b_) : a{a_}, b{b_} {}
int a;
int b;
};

int main()
{
const size_t element_size = sizeof(X);
const size_t element_count = 10;

// memory where new objects are going to be placed
char* memory = new char[element_count * element_size];

// next insertion index
size_t insertion_index = 0;

// construct a new X in the address (place + insertion_index)
void* place = memory + insertion_index;
X* x = new(place) X(1, 2);
// advance the insertion index
insertion_index += element_size;

// check out the new object
cout << "x(" << x->a << ", " << x->b << ")" << endl;

// explicit object destruction
x->~X();

// free the memory
delete[] memory;
}

编辑:如果我理解你的编辑,你想做这样的事情:

Run It Online !

#include <vector>
// init a vector of `element_count x X(1, 2)`
std::vector<X> vec(element_count, X(1, 2));

// you can still get a raw pointer to the array as such
X* ptr1 = &vec[0];
X* ptr2 = vec.data(); // C++11

关于C++动态分配类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com