Мне нужно установить этот указатель на 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 :: option все равно будет первой опцией, после которой будет опция 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;
};
Копирование и назначение отключены, так как они разделяют подпорку за сценой (мелкая копия), которая должна быть либо четко задокументирована, либо отключена путем глубокого копирования в этих функциях.