其他人使用原始指針發佈的解決方案,而是一個智能指針將是一個更好的主意:
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
};
這避免了需要添加一個析構函數,並含蓄地禁止複製(除非你寫你的。自己operator=
和MyClass(const MyClass &)
如果你想避免單獨堆分配,這可以用做升壓轉換器的aligned_storage
和安置新的未經檢驗:
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();
}
}
或者,如果Object
是可複製(或移動),您可以使用boost::optional
:
class MyClass {
boost::optional<Object> obj;
public:
MyClass() {
// ...
obj = Object(...);
obj->foo();
}
};
爲什麼不使用動態初始化? auto_ptr的/ shared_ptr的? – qehgt
全球範圍或班級成員?您的代碼與您的問題不符。 –
調用默認構造函數時會出現什麼問題,然後在初始化後將其設置爲您關心的對象,就像您的代碼一樣?或者只是讓它成爲一個指針:'Object * myObj;' – Chad