其他人已经发布了使用原始指针的解决方案,但是智能指针会是一个更好的主意:
class MyClass {
std::unique_ptr 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=和Object。
如果要避免单独的堆分配,可以使用boost的Object和new放置。 未经测试:
template
class DelayedAlloc : boost::noncopyable {
boost::aligned_storage 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
void construct(Args&&... args)
{
assert(!valid);
new(storage.address()) T(std::forward(args)...);
valid = true;
}
void destruct() {
assert(valid);
valid = false;
get().~T();
}
~DelayedAlloc() { if (valid) destruct(); }
};
class MyClass {
DelayedAlloc obj;
public:
MyClass() {
// ...
obj.construct(...);
obj.get().foo();
}
}
或者,如果Object是可复制的(或可移动的),则可以使用boost::optional:
class MyClass {
boost::optional obj;
public:
MyClass() {
// ...
obj = Object(...);
obj->foo();
}
};