class在c语言中,class-在C ++中定义对象而不调用其构造函数

其他人已经发布了使用原始指针的解决方案,但是智能指针会是一个更好的主意:

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();

}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值