gpt4 book ai didi

c++ - RAII类设计

转载 作者:太空宇宙 更新时间:2023-11-04 16:27:53 25 4
gpt4 key购买 nike

假设我有一个以 RAII 方式管理某些资源的类:

class C
{
HANDLE hResource_;

// prevent sharing the ownership over the resource among multiple instances of C
C(const C&);
C& operator=(const C&);

public:
C() : hResource_(INVALID_HANDLE){}

C(int arg1, const std::string& arg2,...)
{
...
allocResource(arg1, arg2, ...);
...
}

~C
{
...
FreeResource(hResource_);
hResource_ = INVALID_HANDLE;
...
}

void allocResource(int arg1, const std::string& arg2, ...)
{
if(hResource_ == INVALID_HANDLE)
{
hResource_ = AllocateResource(arg1, arg2,...);
}
}

HANDLE handle() {return hResource_;}
};

它的构造函数采用资源分配所需的一些参数,我能够创建它的一个实例,使用它并让它存在于某个范围内:

// some global function 
void goo()
{
C c(123, "test");
UseResource(c.handle(),...);
...
}

假设我现在想让 C 的一个实例成为某个类的成员,并且想延迟发生在 C 的 c 中的资源分配-器。这需要 C 的默认 c-tor 和一些 C 执行资源分配的成员函数(例如 allocResource() 调用 AllocateResource())。

class A
{
C c_;

public:
void foo1()
{
...
c_.allocResource(123, "test");
UseResource(c_.handle(),...);
...
}

void foo2()
{
...
UseResource(c_.handle(),...);
...
}
};

通过使用专用函数,我们以某种我不喜欢的方式暴露了 C 的内部结构。

我的问题是:这种方法是启用惰性初始化的常用方法吗?有没有其他选择?


编辑:这是关于以下(MSalters 的)建议的可能类设计:

class C
{
HANDLE hResource_;

// prevent sharing the ownership over the resource
// among multiple instances of C
C(const C&);
C& operator=(const C&);

public:

// prevent object creation if resource cannot be acquired
C(int arg1, const std::string& arg2,...)
{
hResource_ = AllocateResource(arg1, arg2,...);

// assumption: AllocateResource() returns
// INVALID_HANDLE in case of failure
if(hResource_ == INVALID_HANDLE)
throw resource_acquisition_exception();
}

~C
{
...
FreeResource(hResource_);
hResource_ = INVALID_HANDLE;
...
}

HANDLE handle() {return hResource_;}
};

class A
{
std::unique_ptr<C> c_;

public:
void foo1()
{
try
{
...
c_ = std::unique_ptr<C>(new C(123, "test"));
UseResource(c_->handle(),...);
...
}
catch(const resource_acquisition_exception& exc)
{
...
}
catch(...)
{
...
}
}

void foo2()
{
...
UseResource(c_->handle(),...);
...
}
};

最佳答案

不,这不是执行 RAII 的常用方法。事实上,它根本不是 RAII。如果您不能为 C 分配必要的资源,请不要创建 C

关于c++ - RAII类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10190057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com