C++ 具有非默认构造函数且不使用STL的对象数组
我想用非默认构造函数创建一个对象数组。请注意,我不允许使用STL中的vector,我对此进行了研究并找到了一种方法:C++ 具有非默认构造函数且不使用STL的对象数组,c++,arrays,C++,Arrays,我想用非默认构造函数创建一个对象数组。请注意,我不允许使用STL中的vector,我对此进行了研究并找到了一种方法: Obj* p_obj[3];// for an array of 3 for example // then allocate to each pointer using new p_obj[0] = new Obj(10); p_obj[1] = new Obj(15); p_obj[2] = new Obj(20); 虽然当我试图创建一个更大的数组(100个元素)时,我的程
Obj* p_obj[3];// for an array of 3 for example
// then allocate to each pointer using new
p_obj[0] = new Obj(10);
p_obj[1] = new Obj(15);
p_obj[2] = new Obj(20);
虽然当我试图创建一个更大的数组(100个元素)时,我的程序出错了。
如果有人能给我一个解决这个问题的好办法,我将不胜感激
提前谢谢你 如果你不能使用向量
struct myVector
{
private:
Obj *p_obj;
std::size_t size_;
public:
myVector(): size_(0)
{
}
/*
myVector(int const &size): size(size_)
{
p_obj = new Obj[size_];
}
*/
~myVector()
{
if(size_ != 0)
{
delete[] p_obj;
}
}
void resize(int const&size)
{
// delete or append new memory
}
void push_back(int const &rhs)
{
// push here, check size and allocate needed memory
}
Obj *begin()
{
// Check size and return first element
}
Obj *end()
{
// Check size and return end element
}
}
这是非常基本的东西,您还可以使用迭代器封装,这将为您节省很多麻烦
如果这是针对类的,那么根据
vector
功能提出您自己的vector
会很有用 首先,您的代码是完全正确的。如果它崩溃,一定是其他地方的内存错误
其次,您的代码是低效的,因为它单独分配了许多小对象,并且使用了双间接寻址。矢量如何工作(默认情况下)的关键是“放置新”。用法示例:
Obj* objects = static_cast<Obj*>(operator new(sizeof(*objects) * n));
for (size_t i = 0; i < n; ++n)
new (objects + i) Obj("Constructor arguments...")
Obj*objects=static_cast(新操作符(sizeof(*objects)*n));
对于(尺寸i=0;i
删除时,必须在释放存储之前手动调用单个元素的析构函数。就是
for (size_t i = 0; i < n; ++n)
objects[i].~Obj();
operator delete(objects);
(大小i=0;i
对象[i]。~Obj();
操作员删除(对象);
建议使用RAII包装器来执行上述分配和解除分配
此外,为什么不允许您使用STL中的
vector
?请发布带有错误的代码有任何理由拒绝使用标准库吗?这是一个学习练习?@Manu343726:这是一个家庭作业@Bryan Chen:有很多东西要发布。我只想保证这种方法是正确的correct@Oleksandr您发布的代码没有理由会崩溃,因此我们需要更多信息。嗯,没有。新的Obj[size_uj]要求Obj有一个默认构造函数。此外,myVector(){}将导致崩溃,因为它使p_Obj未初始化。不要那样做。为什么要通过常量引用传递整数呢。。。为该特定功能添加了推回功能。。。也有访问权限的私有指针。。。以这种速度,我们将最终创建vector类。。。我认为如果这是作业,他应该自己定义方法。。。你不这么认为吗?哦,我认为这种情况下,通过值或引用传递是不相关的,但是我没有改变里面的参数,所以它更清晰。自2013年起,该标准没有提及任何内容。矢量头文件是一个包含其他7个头文件的头文件,stl_矢量是一个超过1400行的模板。目的是帮助他,但不是完全给出解决方案,也不是让他完全放弃。阅读标准是一回事,阅读标准中的代码是另一回事。这太过分了。