将std::vector v传递给类的ctor,该类需要在相应实例的整个生命周期内访问v
Pass a std::vector v to the ctor of a class which needs to access v during the whole life time of a corresponding instance
我想将std::vector<double> v
传递给类A
的构造函数,该构造函数需要在相应实例的整个生命周期内访问v
。由于v
被认为是巨大的,所以我不想复制v
。
我们可以做以下操作:选项1:
class A
{
public:
A(std::vector<double> const& v)
: m_v(v)
{ }
private:
std::vector<double> const& m_v
};
如果我们可以保证引用的v
对象的生存时间至少与A
的相应实例的生存时间一样长,那么这可能是一个合适的选项。但我们不太可能保证这一点。
选项2:
class A
{
public:
A(std::shared_ptr<std::vector<double>> v)
: m_v(v)
{ }
private:
std::shared_ptr<std::vector<double>> m_v;
};
此选项没有生命周期问题。然而,我不确定这是否真的是最佳实践。那么,我们应该怎么做呢?
-
如果您不能保证引用的
v
对象的生存时间至少与A
的相应实例的生存时间一样长, -
如果你不想复制
v
,
那么CCD_ 11是要走的路。它被认为是的最佳实践。
例如,参见Herb Sutter 的《91周大师》
注意:shared_ptr
会延长v
的寿命,而weak_ptr
不会——在A
的生命中,你可能会失去v
(以安全的方式(。您是否需要其中一个取决于您的用例。
如果向量必须在A实例的整个生命周期内保持活动,我会选择选项2,否则我会考虑std::weak_ptr<std::vector<双>gt;
如果我们可以保证引用的v对象的生存时间至少与a的相应实例的生存时间一样长,这可能是一个合适的选项。但我们不太可能保证这一点
(强调我的(表明在设计上还有更多的工作要做。要么你的类控制向量的生存期,要么它依赖于它。它是哪个?这一点在任何文档和界面描述中都应该清楚。
如果您规定A
取决于可用的矢量,则可以在接口中要求:
A::A(const std::vector<double>& v) // Demand that v outlives A
: _v(v) {}
如果您规定A
将与其他对象共享矢量,然后在接口中要求:
A::A(std::shared_ptr<const std::vector<double>> pv) // demand shared ownswership
: _pv(std::move(pv)) {}
如果您规定A
将实际控制矢量的寿命(然后拥有它(,则move
将矢量放入其中,或者move
将unique_ptr放入A
:
// call with auto a = A(std::move(v));
// or auto a = A(std::vector<double>(...));
A::A(std::vector<double> v) // demand ownership or copy
: _v(std::move(v)) {}
// or
A::A(std::unique_ptr<const std::vector<double>> pv) // demand ownership
: _pv(std::move(pv)) {}
"最佳实践"的一部分是使用接口定义为客户提供保证并提出要求。
然而,我不确定这是否真的是最佳实践。那么,我们应该怎么做呢?
auto make_huge_vector()
{
return std::make_shared<std::vector<double>>( /* ... */ );
}
当前最佳实践(如果需要,强制延长矢量的使用寿命(:
class A
{
public:
A(std::shared_ptr<std::vector<double>> v): v_{ std::move(v) } {}
private:
std::shared_ptr<std::vector<double>> v_;
};
// client code:
auto v = make_huge_vector();
A a{v};
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 从DLL中删除类的实例
- 在std::vector上存储带有模板的类实例
- 将std::vector v传递给类的ctor,该类需要在相应实例的整个生命周期内访问v