我有一个情况,我有一个指向stl向量的指针
所以喜欢
vector<MyType*>* myvector;
Run Code Online (Sandbox Code Playgroud)
我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载.
我如何将其实例化为向量的新实例?
假设您正确定义向量:
vector<int>* myvector; // Note vector must be parametrized with a type.
// There is no such thing as a a naked vector.
Run Code Online (Sandbox Code Playgroud)
初始化为NULL
myclass::myclass()
:myvector(NULL) // You can use 0 here but I still like NULL because it
{} // gives me more information. Waiting for the new keyword.
Run Code Online (Sandbox Code Playgroud)
首次使用时实例化:
myvectr = new vector<int>(100); // reserve some space as appropriate
Run Code Online (Sandbox Code Playgroud)
但是你不应该把RAW指针作为你班级的成员(除非有一个很好的理由).您需要编写自己的复制构造函数和赋值运算符.
或者你可以用智能指针包裹'myvector'.或者甚至更好地使它成为正常的矢量.没有必要使它成为一个指针.
我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载.
我如何将其实例化为向量的新实例?
我不确定我一直都懂你.为什么不简单地将向量留空,并设置一个布尔值,说明属性是否已加载?或者,您可以使用boost::optional
boost::optional< vector<MyType*> >
Run Code Online (Sandbox Code Playgroud)
要么
boost::optional< vector< shared_ptr<MyType> > >
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过取消引用可选对象来简单地接收对象,并像往常一样为其分配向量.
我不会使用指针.它使问题变得复杂,你必须考虑复制包含该属性的对象时会发生什么,...
如果你真的必须使用指针,你可以这样做
struct A {
A():prop() { }
~A() { delete prop; }
vector< MyType *>& get() {
if(!prop) prop = new vector< MyType* >();
return prop;
}
private:
// disable copy and assignment.
A(A const&);
A& operator=(A const&);
vector< MyType* > *prop;
};
Run Code Online (Sandbox Code Playgroud)
或者使用shared_ptr,这将是我的程序中的方式(但是boost :: optional仍然是第一个选项,之后将是vector-and-boolean选项,之后将是以下)
struct A {
typedef vector< shared_ptr<MyType> > vector_type;
vector_type &get() {
if(!prop) {
prop.reset(new vector_type);
}
return *prop;
}
private:
// disable copy and assignment.
A(A const&);
A& operator=(A const&);
shared_ptr< vector_type > prop;
};
Run Code Online (Sandbox Code Playgroud)
复制和分配被禁用,因为它们将共享场景背后的支柱(浅拷贝),应该通过深度复制在这些功能中清楚地记录或禁用.
| 归档时间: |
|
| 查看次数: |
43393 次 |
| 最近记录: |