C++ - 重载结构取消引用运算符并在 unique_ptr 中使用它
C++ - overload structure dereference operator and use it in unique_ptr
我有一个实现 class 和一个包装器 class,我想通过包装器 class 和结构解引用访问实现 class 实例 (->)操作员。到目前为止,没问题。
class Implementation
{
public:
doSomething();
}
class Wrapper
{
public:
Implementation* operator->() {
return _implPtr.get();
}
private:
std::shared_ptr<Implementation> _implPtr;
}
当我像下面这样使用它时它起作用了:
Wrapper wrapper;
wrapper->doSomething();
但是当我将包装器 class 与 unique_ptr 一起使用时,编译器会抛出错误:
auto wrapper = std::make_unique<Wrapper>();
wrapper->doSomething();
错误是“'class Wrapper' 没有名为 'doSomething' 的成员”。
在这种情况下如何访问实现 class?
std::unique_ptr
(和 std::shared_ptr
)有自己的 operator->
到 return 它持有的指针。
您的失败代码本质上是这样做的:
auto wrapper = std::make_unique<Wrapper>();
//wrapper->doSomething();
Wrapper *ptr = wrapper.operator->();
ptr->doSomething(); // ERROR!
的确,你的Wrapper
class中没有doSomething()
方法。
要执行您正在尝试的操作,您需要取消引用 Wrapper*
指针以访问实际的 Wrapper
对象,然后您可以调用它自己的 operator->
来访问它的 Implementation*
指针,eg:
auto wrapper = std::make_unique<Wrapper>();
(*wrapper)->doSomething();
基本上是这样做的:
auto wrapper = std::make_unique<Wrapper>();
//(*wrapper)->doSomething();
Wrapper &ref = wrapper.operator*();
Implementation *impl = ref.operator->();
impl->doSomething(); // OK!
我有一个实现 class 和一个包装器 class,我想通过包装器 class 和结构解引用访问实现 class 实例 (->)操作员。到目前为止,没问题。
class Implementation
{
public:
doSomething();
}
class Wrapper
{
public:
Implementation* operator->() {
return _implPtr.get();
}
private:
std::shared_ptr<Implementation> _implPtr;
}
当我像下面这样使用它时它起作用了:
Wrapper wrapper;
wrapper->doSomething();
但是当我将包装器 class 与 unique_ptr 一起使用时,编译器会抛出错误:
auto wrapper = std::make_unique<Wrapper>();
wrapper->doSomething();
错误是“'class Wrapper' 没有名为 'doSomething' 的成员”。
在这种情况下如何访问实现 class?
std::unique_ptr
(和 std::shared_ptr
)有自己的 operator->
到 return 它持有的指针。
您的失败代码本质上是这样做的:
auto wrapper = std::make_unique<Wrapper>();
//wrapper->doSomething();
Wrapper *ptr = wrapper.operator->();
ptr->doSomething(); // ERROR!
的确,你的Wrapper
class中没有doSomething()
方法。
要执行您正在尝试的操作,您需要取消引用 Wrapper*
指针以访问实际的 Wrapper
对象,然后您可以调用它自己的 operator->
来访问它的 Implementation*
指针,eg:
auto wrapper = std::make_unique<Wrapper>();
(*wrapper)->doSomething();
基本上是这样做的:
auto wrapper = std::make_unique<Wrapper>();
//(*wrapper)->doSomething();
Wrapper &ref = wrapper.operator*();
Implementation *impl = ref.operator->();
impl->doSomething(); // OK!