Inni napisali rozwiązania za pomocą surowych wskaźników, ale inteligentny wskaźnik byłby lepszy pomysł:
class MyClass {
std::unique_ptr<Object> pObj;
// use boost::scoped_ptr for older compilers; std::unique_ptr is a C++0x feature
public:
MyClass() {
// ...
pObj.reset(new Object(...));
pObj->foo();
}
// Don't need a destructor
};
Eliminuje to potrzebę dodania destruktor, a pośrednio zabrania kopiowania (chyba piszesz swoje . własna operator=
i MyClass(const MyClass &)
Jeśli chcesz uniknąć osobnego alokację sterty, można to zrobić z doładowania na aligned_storage
i umieszczenie nowego Nietestowane.
template<typename T>
class DelayedAlloc : boost::noncopyable {
boost::aligned_storage<sizeof(T)> storage;
bool valid;
public:
T &get() { assert(valid); return *(T *)storage.address(); }
const T &get() const { assert(valid); return *(const T *)storage.address(); }
DelayedAlloc() { valid = false; }
// Note: Variadic templates require C++0x support
template<typename Args...>
void construct(Args&&... args)
{
assert(!valid);
new(storage.address()) T(std::forward<Args>(args)...);
valid = true;
}
void destruct() {
assert(valid);
valid = false;
get().~T();
}
~DelayedAlloc() { if (valid) destruct(); }
};
class MyClass {
DelayedAlloc<Object> obj;
public:
MyClass() {
// ...
obj.construct(...);
obj.get().foo();
}
}
Lub, jeśli Object
jest copyable (lub ruchome), można użyć boost::optional
:
class MyClass {
boost::optional<Object> obj;
public:
MyClass() {
// ...
obj = Object(...);
obj->foo();
}
};
Dlaczego nie używać dynamicznej inicjalizacji? auto_ptr/shared_ptr? – qehgt
Globalny zasięg lub członek klasy? Twój kod nie pasuje do Twojego pytania. –
Co jest nie tak z wywołaniem domyślnego konstruktora, a po inicjalizacji ustawiasz go na obiekt, na którym ci zależy, dokładnie tak, jak robi to twój kod? Lub po prostu uczyń go wskaźnikiem: 'Object * myObj;' – Chad