2012-11-01 81 views
0

我想创建一个像容器向量的向量。创建独立于构造函数参数的对象指针

随后宣布:

Vector< A> Avector. 

虽然分配内存它给出了一个不具有默认构造函数编译错误。 我写了下面的代码来分配内存。

char *pBuffer = (char*) malloc(size*sizeof(T)); 
    T *array; 
    for(int i = 0; i < size; i++) 
    { 
    (array+i) = new(pBuffer + i) T; 
    } 
    return array; 

T是模板变量。

该错误是由于这样的事实:在放置新我使用的T默认构造函数,而我没有写一个默认的构造函数为A.

我想知道,有没有什么办法让内存分配不依赖于构造函数签名。

回答

2

在C++调用new做了两两件事:

  1. 被中分配创建&
  2. 提供机会向正确初始化对象足够的内存为对象通过调用其构造函数。

这是C++作为一种语言的基本设计特性,pt 2被添加到可以克服malloc行为的分配内存中。

总之,你不能改变这种行为。

1

这不是依赖于构造函数签名的内存分配。这是初始化它。

即使在您的示例中,分配也是由malloc执行的,无需调用任何构造函数。这是初始化(由placement-new执行),需要使用构造函数。

没有办法在不调用构造函数的情况下初始化用户定义的对象。

但是,至少在C++ 11中,您可以执行的操作是将代码放入一个函数,该函数将构造函数所需的参数作为rvalue-references接受,并将它们传递给构造函数调用在放置新的。这种方式取决于函数的调用者传递正确的参数。如果没有参数传递,将调用默认构造函数。

这实际上是由新std::vectoremplace-style functions使用的技术:

template< class... Args > 
void emplace_back(Args&&... args); 

这是一个可变参数模板,因此任何数量的参数(零个或多个)是可能的。右值引用来带他们,并实现内部,你不得不调用使用std::forward,确保参数传递的,是构造函数:

(array+i) = new (pBuffer + i) T(std::forward<Params>(args)...); 

所以这仍然需要使用一个构造函数,但它留给调用者选择构造函数(通过选择参数)。如果没有默认构造函数可用,调用者只需提供调用非默认构造函数所需的参数。