C++ C++;使用唯一指针为向量类订阅运算符[]
我正在使用C++ C++;使用唯一指针为向量类订阅运算符[],c++,vector,malloc,smart-pointers,unique-ptr,C++,Vector,Malloc,Smart Pointers,Unique Ptr,我正在使用malloc编写自己的向量类。特别是,为了提供一个极小的示例,我只展示了构造函数和订阅操作符[] #include <iostream> #include <algorithm> #include <utility> #include <cstdlib> template<typename T> class Vector{ std::unique_ptr<T,decltype(&free)> elem
malloc
编写自己的向量类。特别是,为了提供一个极小的示例,我只展示了构造函数和订阅操作符[]
#include <iostream>
#include <algorithm>
#include <utility>
#include <cstdlib>
template<typename T>
class Vector{
std::unique_ptr<T,decltype(&free)> elem{nullptr,free};
std::size_t _size{};
std::size_t _capacity{};
public:
Vector() = default;
~Vector(){
for(auto i = 0; i <_size; ++i){
// invoke the destructor
}
}
Vector(std::initializer_list<T> list): // pass by value
elem{static_cast<T*>(malloc(list.size()*sizeof(T))), free},
_size{list.size()},
_capacity{list.size()}{
std::uninitialized_copy(list.begin(), list.end(), elem.get());
}
auto& operator[](const std::size_t i){
return elem[i];
}
const auto& operator[](const std::size_t i) const{
return elem[i];
}
};
问题似乎是我无法访问我的unique\u ptr
的I
-th元素,但我真的无法理解问题所在如何修复此问题,以便我实现的所有其他功能都能正常工作?另外,我的elem[i]
中的问题是elem
是一个唯一的\u prt
?std::unique\u ptr
没有操作符[]
,但是std::unique\u ptr
有
所以你可以用
std::unique_ptr<T[], decltype(&free)> elem{nullptr,free};
std::unique_ptr elem{nullptr,free};
注意:为deleter使用类允许空基优化(EBO),并简化调用站点:
struct Free
{
void operator()(void* p) const { free(p); }
};
std::unique_ptr<T[], Free> elem{nullptr};
struct-Free
{
void运算符()(void*p)常量{free(p);}
};
std::unique_ptr elem{nullptr};
std::unique\u ptr
没有运算符[]
,但是std::unique\u ptr
有
所以你可以用
std::unique_ptr<T[], decltype(&free)> elem{nullptr,free};
std::unique_ptr elem{nullptr,free};
注意:为deleter使用类允许空基优化(EBO),并简化调用站点:
struct Free
{
void operator()(void* p) const { free(p); }
};
std::unique_ptr<T[], Free> elem{nullptr};
struct-Free
{
void运算符()(void*p)常量{free(p);}
};
std::unique_ptr elem{nullptr};
显示的代码显然是在错误的概念下运行的,unique\u ptr
是一种类似数组的对象,它有一个重载的[]
操作符?不是那样的elem
是一个std::unique\u ptr
。为了使elem[i]
工作std::unique\u ptr
需要重载[]
操作符。“不,我明白你的意思了。但是我如何才能使我的std::unique\u prt
具有[]
运算符?您是指存储在std::unique\u ptr
中的指针?使用其get()
方法检索存储的指针,并在其上使用[]
运算符。@SamVarshavchik就像elem.get()[i]
?哦,您还必须在声明中添加括号:std::unique\u ptr显示的代码显然是在错误的观念下运行的,unique\u ptr
是一种类似数组的对象,它有一个重载的[]
操作符?不是那样的elem
是一个std::unique\u ptr
。为了使elem[i]
工作std::unique\u ptr
需要重载[]
操作符。“不,我明白你的意思了。但是我如何才能使我的std::unique\u prt
具有[]
运算符?您是指存储在std::unique\u ptr
中的指针?使用其get()
方法检索存储的指针,并在其上使用[]
运算符。@SamVarshavchik就像elem.get()[i]
?哦,您还必须在声明中添加括号:std::unique\ptr