实例化一个新的stl向量

np-*_*ard 4 c++ stl

我有一个情况,我有一个指向stl向量的指针

所以喜欢

vector<MyType*>* myvector;
Run Code Online (Sandbox Code Playgroud)

我必须在构造函数中将此指针设置为NULL,然后在触摸属性时延迟加载.

我如何将其实例化为向量的新实例?

Mar*_*ork 7

假设您正确定义向量:

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'.或者甚至更好地使它成为正常的矢量.没有必要使它成为一个指针.


Joh*_*itb 5

我必须在构造函数中将此指针设置为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)

复制和分配被禁用,因为它们将共享场景背后的支柱(浅拷贝),应该通过深度复制在这些功能中清楚地记录或禁用.