allocator::construct的用法,在构造和函数只有一个参数时,我们很容易知道它的用法是这样:
//#include "CAnimal.h"
#include <memory>
#include <iostream>
using namespace std;
class Animal
{
public:
#if 0 //即使为0,没有默认构造也是可以,
Animal() : num(0)
{
cout << "Animal constructor default" << endl;
}
#endif
Animal(int _num) : num(_num)
{
cout << "Animal constructor param" << endl;
}
~Animal()
{
cout << "Animal destructor" << endl;
}
void show()
{
cout << this->num << endl;
}
private:
int num;
};
/*
由于allocator将内存空间的分配和对象的构建分离
故使用allocator分为以下几步:
1.allocator与类绑定,因为allocator是一个泛型类
2.allocate()申请指定大小空间
3.construct()构建对象,其参数为可变参数,所以可以选择匹配的构造函数
4.使用,与其它指针使用无异
5.destroy()析构对象,此时空间还是可以使用
6.deallocate()回收空间
*/
int main()
{
allocator<Animal> alloc; //1.
Animal *a = alloc.allocate(5); //2.
//3.
/*void construct(U* p, Args&&... args);
在p指向的位置构建对象U,此时该函数不分配空间,pointer p是allocate分配后的起始地址
constructor将其参数转发给相应的构造函数构造U类型的对象,相当于 ::new ((void*) p)
U(forward<Args> (args)...);
*/
alloc.construct(a, 1);
alloc.construct(a + 1);
alloc.construct(a + 2, 3);
alloc.construct(a + 3);
alloc.construct(a + 4, 5);
//4.
a->show();
(a + 1)->show();
(a + 2)->show();
(a + 3)->show();
(a + 4)->show();
//5.
for (int i = 0; i < 5; i++)
{
alloc.destroy(a + i);
}
//对象销毁之后还可以继续构建,因为构建和内存的分配是分离的
//6.
alloc.deallocate(a, 5);
cin.get();
return 0;
}
但是当我将上面的构造函数变成2个参数时:
……
Animal(int _num,int _weight) : num(_num),weight(_weight)
{
cout << "Animal constructor param" << endl;
}
……
void show()
{
cout <<“num:”<< this->num << endl;
cout << "weight:" << this->weight<< endl;
}
private:
int num;
int weight;
};
我想这样使用:
alloc.construct(a , 3,600);
alloc.construct(a + 1, 5,300);
……
会报错
我这样用才可以:
alloc.construct(a , Animal(3,600));
alloc.construct(a + 1,Animal( 5,300));
……
请问必须这样用吗?不能alloc.construct(a + 1, 5,300); 这样直接列参数使用?