好的设计?用于分配的智能指针与用于访问的原始指针相结合
Good design? Smart pointers for allocation combined with raw pointers for access
我正在设计一个FilterData
类,它可以读取自定义二进制数据文件并在内存中构建它的数据模型。我想使用智能指针分配所有内存,并让这个FilterData
拥有数据的所有权。当调用方需要访问数据时,它只会从FilterData
实例获取一个原始指针。
你认为这是好的设计,还是作为程序员会觉得这种"混合"令人困惑?
一些想法:
-
为什么是原始指针?我需要与使用原始
float*
的现有 API 进行交互。此外,我强调调用方不拥有分配的内存。我的大多数"客户"都是编码人员,他们在处理智能指针方面没有经验。 -
如果我需要数据的副本,我可以使用相应的函数扩展
FilterData
,这些函数返回带有副本std::unique_ptr
(因此转移副本的所有权)。 -
作为一个可能的危险,我看到有人可能会在返回的指针上调用
delete
,但由于我计划使用智能指针进行所有内存分配,因此无论如何任何delete
都是错误的。
下面是一些示例代码:
#include <iostream>
#include <vector>
#include <string>
#include <memory>
class FilterData
{
using fvec = std::vector<float>;
public:
FilterData(const std::string& filename) {
// (simulate read from file...)
m_filterACoeffs = std::make_unique<fvec>();
m_filterBCoeffs = std::make_unique<fvec>();
m_filterACoeffs->emplace_back(1.f); m_filterACoeffs->emplace_back(2.f); m_filterACoeffs->emplace_back(3.f);
m_filterBCoeffs->emplace_back(-1.f); m_filterBCoeffs->emplace_back(-2.f); m_filterBCoeffs->emplace_back(-3.f);
}
const fvec* getFilterACoeffs() { return m_filterACoeffs.get(); }
const fvec* getFilterBCoeffs() { return m_filterBCoeffs.get(); }
private:
std::unique_ptr<fvec> m_filterACoeffs;
std::unique_ptr<fvec> m_filterBCoeffs;
};
int main()
{
FilterData filterData("thefile.bin");
auto p_filterACoeffs = filterData.getFilterACoeffs();
auto p_filterBCoeffs = filterData.getFilterBCoeffs();
std::cout << "Filter A is: " << p_filterACoeffs->at(0) << " , "
<< p_filterACoeffs->at(1) << " , "
<< p_filterACoeffs->at(2) << std::endl;
std::cout << "Filter B is: " << p_filterBCoeffs->at(0) << " , "
<< p_filterBCoeffs->at(1) << " , "
<< p_filterBCoeffs->at(2) << std::endl;
}
在所有权被转让时使用并公开unique_ptr。当所有权是公共所有权时,请使用shared_ptr。定义函数以采用原始指针或引用,如果它们不参与所有权。
在您的情况下,请使用unique_ptr但不公开它或访问它的方法。你做到了,对你太好了。暴露原始指针,必要时进行修改,如果有人想在上面调用删除,嘿,这是他们的脚。我宁愿以需要较少键入的方式公开原始指针。
CPP Con 2014的这个演讲一针见血:https://youtu.be/xnqTKD8uD64?t=12m10s(我知道链接是邪恶的,但我怀疑这个链接会一直活到自由女神像深的沙子里。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 用于C++中带有数组和指针的循环
- std::byte 指针应该用于指针算术吗?
- 用于输出矩阵的二维指针
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- 下步指针键入用于shared_ptr的级别
- 专门用于"direct"函数类型(与函数指针类型相对)
- C++模板,用于通过常量引用和原始指针传递向量
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 用于获取数组长度的指针数学
- C++ 常量用于指针指向指针
- Lua C API 不适用于指针
- 用于指针的rvalue/const lvalue
- 我有" my_string "类。我重载了运算符 " == " ,但它不适用于指针 (my_string*)
- 重载流<<运算符,用于指针/共享指针和其他类型的
- 为什么没有必要将此关键字用于指针
- 用于指针块的新位置
- 十六进制<< setw() << setfill() 不适用于指针值输出
- 专门用于指针的模板
- 是否有一个用于指针删除的函数(对象)模板可在某处重新使用(boost, STL)