- 主题:思考一个特别需要:销毁实例的同时,转移出来一个资源
代码库里有个类A,构造函数要传入一个资源R。但是,传入的资源挺有用的。有的时候想销毁A的时候取出R,再次使用在另一个类B中。但是咋做呢?A的析构函数没有返回值啊。
那么,就得写一个函数,把R拿出来,然后把A标记为不能用了。
有没有办法给C++标准里加入不同的析构函数,来获取原来构造时传入的资源?
class A{
public:
A(R&& r){...}
R return_resource::_1 ~A(){...}
private:
R _r; // _1
};
--
FROM 98.42.143.*
析构时将R释放到pool中?
--
FROM 222.129.205.*
【 在 bihai 的大作中提到: 】
: 代码库里有个类A,构造函数要传入一个资源R。但是,传入的资源挺有用的。有的时候想销毁A的时候取出R,再次使用在另一个类B中。但是咋做呢?A的析构函数没有返回值啊。
: 那么,就得写一个函数,把R拿出来,然后把A标记为不能用了。
: 有没有办法给C++标准里加入不同的析构函数,来获取原来构造时传入的资源?
: ...................
shared_ptr<R>
--
FROM 110.191.212.*
感觉很适合移动语义啊
实现个 move ctor
~Obj() {
if (data_) {
release(data_);
data_ = nullptr;
}
}
Obj(Obj&& o) {
data_ = o.data_;
o.data_ = nullptr;
.....
}
Obj b(std::move(a));
【 在 bihai 的大作中提到: 】
: 代码库里有个类A,构造函数要传入一个资源R。但是,传入的资源挺有用的。有的时候想销毁A的时候取出R,再次使用在另一个类B中。但是咋做呢?A的析构函数没有返回值啊。
: 那么,就得写一个函数,把R拿出来,然后把A标记为不能用了。
: 有没有办法给C++标准里加入不同的析构函数,来获取原来构造时传入的资源?
: ...................
--
FROM 125.168.119.*
这种直接传裸指针进去不就行了,A不拥有R,B也不拥有R,R应该在更高的作用域范围。
--
FROM 222.129.49.*
你自己写析构函数,想怎么就怎么呀?
struct ResourceItem;
struct ResourcePool
{
std::unique_ptr<ResourceItem> Get();
void Return(std::unique_ptr<ResourceItem> x);
};
struct A
{
A(ResourcePool& aPool)
: _pool(aPool)
, _resource(std::move(aPool.Get()))
{}
~A()
{
_pool.Return(std::move(_resource));
}
ResourcePool& _pool;
std::unique_ptr<ResourceItem> _resource;
};
【 在 bihai 的大作中提到: 】
: 代码库里有个类A,构造函数要传入一个资源R。但是,传入的资源挺有用的。有的时候想销毁A的时候取出R,再次使用在另一个类B中。但是咋做呢?A的析构函数没有返回值啊。
: 那么,就得写一个函数,把R拿出来,然后把A标记为不能用了。
: 有没有办法给C++标准里加入不同的析构函数,来获取原来构造时传入的资源?
: ...................
--
FROM 182.150.115.*
根据资源在使用过程中是否需要修改,对应着不同的方案。
--
FROM 124.127.146.*
你这方案有点费解,销毁A还需要手动调析构函数,才能用得上吧?
说清楚B在A销毁时,一定要构造吗?
最简单的方案,就是传裸指针,谁也不碍着谁吧,A就是拿着R玩玩而已。
【 在 bihai 的大作中提到: 】
: 代码库里有个类A,构造函数要传入一个资源R。但是,传入的资源挺有用的。有的时候想销毁A的时候取出R,再次使用在另一个类B中。但是咋做呢?A的析构函数没有返回值啊。
: 那么,就得写一个函数,把R拿出来,然后把A标记为不能用了。
: 有没有办法给C++标准里加入不同的析构函数,来获取原来构造时传入的资源?
: ...................
--
FROM 61.185.187.*
颗粒度太细的东西,还是要考虑使用场景,一般都要带个批量功能,不然性能都浪费在加flag和去flag上。weak_ptr转shared_ptr, shared_ptr判断是否销毁,这些都是性能巨坑
--
FROM 125.119.104.*
不要掉进over-engineering的坑
--
FROM 125.119.104.*