C++ c+中的空动态数组+;

C++ c+中的空动态数组+;,c++,dynamic-arrays,C++,Dynamic Arrays,假设我有一个名为Square的对象,它具有构造函数Square(int rx,int ry),我想创建一个动态的正方形数组,在构造函数中具有不同的参数: Square *squares = new Square[10]; for (int i = 0; i < 10; i++) { squares[i] = new Square(i, i); } Square*squares=新的squares[10]; 对于(int i=0;i方块< /代码>的指针数组: Square

假设我有一个名为
Square
的对象,它具有构造函数
Square(int rx,int ry)
,我想创建一个动态的正方形数组,在构造函数中具有不同的参数:

Square *squares = new Square[10];  
for (int i = 0; i < 10; i++)
{
     squares[i] = new Square(i, i);
}
Square*squares=新的squares[10];
对于(int i=0;i<10;i++)
{
正方形[i]=新正方形(i,i);
}
但是这失败了,因为没有合适的默认构造函数可用。那么,如何创建空数组或空数组,然后在以后进行构造呢


编辑:这必须是一个数组,由于代码中的其他因素,这里很难解释。

您可以创建一个指向
Square
的指针数组:

Square **squares = new Square*[10];

for (int i = 0; i < 10; i++)
{
     squares[i] = new Square(i, i);
}
Square**squares=新的squares*[10];
对于(int i=0;i<10;i++)
{
正方形[i]=新正方形(i,i);
}

正如其他人指出的那样,考虑使用<代码> STD::向量是一个不错的主意。

< P>可以制作一个指向“代码>方块< /代码>的指针数组:

Square **squares = new Square*[10];

for (int i = 0; i < 10; i++)
{
     squares[i] = new Square(i, i);
}
Square**squares=新的squares*[10];
对于(int i=0;i<10;i++)
{
正方形[i]=新正方形(i,i);
}

正如其他人指出的,考虑使用<代码> STD::向量< /代码>是不错的主意。

< P>使用<代码>向量< /代码>。只要
Square
是可复制的,它就没有这个问题

vector<Square> squares;
for (int i = 0; i < 10; i++)
{
     squares.push_back(Square(i, i));
}
矢量平方;
对于(int i=0;i<10;i++)
{
正方形。推回(正方形(i,i));
}

使用
向量
。只要
Square
是可复制的,它就没有这个问题

vector<Square> squares;
for (int i = 0; i < 10; i++)
{
     squares.push_back(Square(i, i));
}
矢量平方;
对于(int i=0;i<10;i++)
{
正方形。推回(正方形(i,i));
}

您应该创建一个指向
正方形的指针数组

但是,我还建议使用
std::vector
而不是“经典”数组,如果
Square
可复制,这是一个很好的解决方案

vector<Square> squares;
for (int i = 0; i < 10; i++)
{
     squares.push_back(Square(i, i));
}
但是,如果不是,或者如果您仍然决定使用指针,则将其设置为
std::vector
shared_ptr
,将所有删除负担留给编译器

这将产生如下结果:

#include <vector>
#include <boost/shared_ptr.hpp> //on some compilers, you can use #include <memory> instead

using std::vector;
using boost::shared_ptr; // or using std::shared_ptr

vector<shared_ptr<Square> > squares(10);

for (int i = 0; i < 10; i++)
{
     squares[i].reset(new Square(i, i));
}
#包括
#include//在某些编译器上,可以改用#include
使用std::vector;
使用boost::shared_ptr;//或者使用std::shared\u ptr
向量平方(10);
对于(int i=0;i<10;i++)
{
平方[i]。重置(新平方(i,i));
}

更进一步,您可以查看。

您应该创建一个指向
SQuare
的指针数组

但是,我还建议使用
std::vector
而不是“经典”数组,如果
Square
可复制,这是一个很好的解决方案

vector<Square> squares;
for (int i = 0; i < 10; i++)
{
     squares.push_back(Square(i, i));
}
但是,如果不是,或者如果您仍然决定使用指针,则将其设置为
std::vector
shared_ptr
,将所有删除负担留给编译器

这将产生如下结果:

#include <vector>
#include <boost/shared_ptr.hpp> //on some compilers, you can use #include <memory> instead

using std::vector;
using boost::shared_ptr; // or using std::shared_ptr

vector<shared_ptr<Square> > squares(10);

for (int i = 0; i < 10; i++)
{
     squares[i].reset(new Square(i, i));
}
#包括
#include//在某些编译器上,可以改用#include
使用std::vector;
使用boost::shared_ptr;//或者使用std::shared\u ptr
向量平方(10);
对于(int i=0;i<10;i++)
{
平方[i]。重置(新平方(i,i));
}

更进一步,您可以看看。

标准库容器使用新位置的方式。仅仅使用标准的库容器,比如
std::vector
,绝对是最简单的方法。而新的安置是最难的。分配单个对象并保持数组中的指针(如XEO所提到的)落在中间。

< P>标准库容器的方式是放置新的。仅仅使用标准的库容器,比如
std::vector
,绝对是最简单的方法。而新的安置是最难的。分配单个对象并保持数组中的指针(如XEO所提到的)落在中间。

< P>简单地使用指向指针

的指针。
Square **squares = new Square*[10];  

它应该会起作用。但是我想当你开始使用STL容器,比如vector,你会过得更好。简单地使用指针指向指针

Square **squares = new Square*[10];  

它应该会起作用。但我想,如果您开始使用STL容器,如vector,或者使用与之相同的技术:使用全局新操作符分配“原始”存储空间,并使用placement new在该存储中创建对象,您的境况会更好(并通过直接调用dtor而不是使用delete来销毁它们。

使用
std::vector
,或者使用与之相同的技术:使用全局新操作符分配“原始”存储空间,并使用新放置在该存储中创建对象(并通过直接调用dtor而不是使用delete来销毁它们。

在适用的程序中使用
vector
。如果您确实需要使用原始
新的
,您可以使用新的位置

Square *squares = static_cast<Square*>(operator new(sizeof(*squares) * 10));
for (int i = 0; i < 10; i++) {
  new (static_cast<void*>(squares + i)) Square(i, i);
}

当然,在使用结束时仍然需要手动调用析构函数。

在适用的程序中使用
vector
。如果确实需要使用原始
new
,可以使用placement new

Square *squares = static_cast<Square*>(operator new(sizeof(*squares) * 10));
for (int i = 0; i < 10; i++) {
  new (static_cast<void*>(squares + i)) Square(i, i);
}
Square *squares = new Square[10];
当然,在使用结束时仍然需要手动调用析构函数

Square *squares = new Square[10];
此操作调用默认构造函数10次。并且代码段中没有一个构造函数导致错误。因此,请提供一个构造函数。只需编写setter方法来初始化类成员

for (int i = 0; i < 10; i++)
{
     squares[i] = new Square(i, i);
}
for(int i=0;i<10;i++)
{
正方形[i]=新正方形(i,i);
}
通过在
for
循环中再次执行
new
操作,您只是泄漏了以前获取的内存,但按照您的想法操作

另外,不要忘记在
方块上调用
delete[]

此操作调用默认构造函数10次。并且代码段中没有一个构造函数导致错误。因此,请提供一个构造函数。只需编写setter方法来初始化类成员

for (int i = 0; i < 10; i++)
{
     squares[i] = new Square(i, i);
}
for(int i=0;i<10;i++)
{
正方形[i]=新正方形(i,i);
}
通过在
for
循环中再次执行
new
操作,您只是泄漏了m