2009-06-09 60 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>;