如何实现高效的外接程序C++;模板列表类 假设我们有一个模板化C++列表类。是的,向量是存在的,但关键是要知道如何处理这个问题
构造函数分配一个由n个类型为T的对象组成的块,但由于尚未使用这些对象,因此不会进行初始化 在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁从未初始化过的现有对象。如何将对象中的一个副本复制到数据[已使用]如何实现高效的外接程序C++;模板列表类 假设我们有一个模板化C++列表类。是的,向量是存在的,但关键是要知道如何处理这个问题,c++,templates,placement-new,C++,Templates,Placement New,构造函数分配一个由n个类型为T的对象组成的块,但由于尚未使用这些对象,因此不会进行初始化 在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁从未初始化过的现有对象。如何将对象中的一个副本复制到数据[已使用] #include <string> template<typename T> class DynArray { private: int capacity; int used; T* data;
#include <string>
template<typename T>
class DynArray {
private:
int capacity;
int used;
T* data;
public:
DynArray(int initialCap) : capacity(initialCap), used(0), data((T*)new char[sizeof(T)*capacity]) {}
void add(const T& e) {
//TODO: if the dynarray is full, grow
data[used++] = e; //ERROR! Should use copy constructor!!!
}
};
int main() {
DynArray<std::string> a(5);
a.add(std::string("abc"));
}
#包括
模板
类DynArray{
私人:
国际能力;
使用int;
T*数据;
公众:
DynArray(int initialCap):容量(initialCap),已使用(0),数据((T*)新字符[sizeof(T)*容量]{}
无效添加(const T&e){
//TODO:如果dynarray已满,请增长
数据[used++]=e;//错误!应使用复制构造函数!!!
}
};
int main(){
DynArray a(5);
a、 添加(std::string(“abc”);
}
DynArray类的类型为T
,因此您只需分配一个大小为initialCap
的类型T数组,即
new T[initialCap];
对于内置类型,例如int,元素未初始化
对于其他元素,如string,调用T的默认构造函数来初始化元素
在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁现有对象
data[used++]=e代码>这很好。它将e
赋值给data[used]
-调用字符串的赋值运算符,不会引起任何问题。但是,当阵列增长时,您需要分配容量加倍的新阵列,复制元素并销毁旧数据。DynArray
类的类型为T
,因此您只需分配一个大小为initialCap
的T型阵列,这很简单
new T[initialCap];
对于内置类型,例如int,元素未初始化
对于其他元素,如string,调用T的默认构造函数来初始化元素
在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁现有对象
data[used++]=e代码>这很好。它将e
赋值给data[used]
-调用字符串的赋值运算符,不会引起任何问题。但是,当阵列增长时,您需要分配容量加倍的新阵列,复制元素并销毁旧数据。您应该使用新的布局:
void add(const T& e) {
//TODO: if the dynarray is full, grow
new (data + used) T(e);
used++;
}
Placement new在已分配的内存中构造对象。您应该使用Placement new:
void add(const T& e) {
//TODO: if the dynarray is full, grow
new (data + used) T(e);
used++;
}
Placement new在已分配的内存中构造一个对象。对于您正在尝试执行的操作,您需要调用T
's using。同时,也不要忘记实施:
模板
类DynArray{
私人:
国际能力;
使用int;
T*数据;
公众:
DynArray(int initialCap=0):容量(0)、已用容量(0)、数据(0){
储备(上限);
}
DynArray(const DynArray&src):容量(0)、已用容量(0)、数据(0){
备用(src.容量);
对于(int i=0;i=newSize;--i){
数据[i]->~T();
--使用;
}
}
}
无效添加(const T&e){
如果(已使用==容量){
储备(容量*1.5);
}
新(数据+使用)T(e);
++使用;
}
};
#包括
int main(){
DynArray a(5);
a、 添加(“abc”);
}
对于您正在尝试执行的操作,您需要调用T
的using。同时,也不要忘记实施:
模板
类DynArray{
私人:
国际能力;
使用int;
T*数据;
公众:
DynArray(int initialCap=0):容量(0)、已用容量(0)、数据(0){
储备(上限);
}
DynArray(const DynArray&src):容量(0)、已用容量(0)、数据(0){
备用(src.容量);
对于(int i=0;i