我有一种情况,我有一个指向stl向量的指针
所以喜欢
vector<MyType*>* myvector;
我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载。
如何将其实例化为向量的新实例?
答案 0 :(得分:7)
假设你正确定义了矢量:
vector<int>* myvector; // Note vector must be parametrized with a type.
// There is no such thing as a a naked vector.
初始化为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.
首次使用时实例化:
myvectr = new vector<int>(100); // reserve some space as appropriate
但是你不应该把RAW指针作为你班级的成员(除非有一个很好的理由)。您需要编写自己的复制构造函数和赋值运算符。
或者你也可以用智能指针包裹'myvector'。或者甚至更好地使它成为正常的矢量。没有必要把它变成指针。
答案 1 :(得分:5)
我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载。
如何将其实例化为向量的新实例?
我不确定我是否一直了解你。为什么不简单地将向量留空,并设置一个布尔值,说明属性是否已加载?或者,您可以使用boost::optional
boost::optional< vector<MyType*> >
或
boost::optional< vector< shared_ptr<MyType> > >
然后,您可以通过取消引用可选对象来简单地接收对象,并像往常一样为其分配向量。
我不会使用指针。它使问题变得复杂,你必须考虑复制包含属性的对象时会发生什么,......
如果你真的必须使用指针,你可以这样做
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;
};
或者使用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;
};
复制和分配被禁用,因为它们将共享场景背后的支柱(浅拷贝),应该通过在这些功能中进行深度复制来清楚地记录或禁用。
答案 2 :(得分:1)
myvector = new std::vector<yourtype>;
答案 3 :(得分:1)
你不能有这样的指针:
vector* myvector;
因为vector是一个模板类,必须有一个类型。你可以说:
vector <int> * myvector = 0;
或:
vector <string> * myvector = 0;
然后动态创建一个向量:
myvector = new vector <string>;
答案 4 :(得分:0)
初始化它你需要至少使用该语法将其设置为NULL或类似下面的实例。你也应该按照声明字段的顺序进行,否则可能会发生奇怪的事情。
// Field.
std::vector<int> *myvector;
// Constructor.
myclass() : myvector(new std::vector<int>)
{
}