2009-06-09 54 views
4

我有一个情况,其中i有一个指针到一个STL矢量实例化新的STL矢量

所以像

vector<MyType*>* myvector; 

我必须设置在构造该指针为NULL,然后延迟加载时财产被触动。

我怎样才能实例化这一个向量的新实例?

+0

这是我多一点C++'ish将myvector设置为0而不是NULL。 – 2009-06-09 14:54:38

回答

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;   
}; 

复制和分配被禁用,因为他们ld分享场景背后的道具(浅层副本),这些道具应清晰地记录或通过在这些功能中进行深层复制来禁用。

1
myvector = new std::vector<yourtype>; 
0

那么要初始化它,您至少需要将它设置为NULL或使用该语法的下面的实例。你也应该按照字段声明的顺序来做,否则可能会发生奇怪的事情。

// Field. 
std::vector<int> *myvector; 
// Constructor. 
myclass() : myvector(new std::vector<int>) 
{ 
} 
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'。或者更好地使它成为一个正常的矢量。没有必要将它作为指针。因为向量是一个模板类,并且必须有一个类型

vector* myvector; 

1

你不能haved这样的指针。你可以说:

vector <int> * myvector = 0; 

或:

vector <string> * myvector = 0; 

,然后动态地创建矢量:

myvector = new vector <string>;