c – 智能指针是否可以选择性地隐藏或重定向对它们包装的对象的函数调用?

c – 智能指针是否可以选择性地隐藏或重定向对它们包装的对象的函数调用?,第1张

概述我正在开发一个项目,其中某些对象被引用计数 – 它与COM的设置非常相似.无论如何,我们的项目确实有智能指针,可以减少为这些对象显式调用Add()和Release()的需要.问题是,有时,开发人员仍然使用智能指针调用Release(). 我正在寻找的是一种从智能指针调用Release()创建编译时或运行时错误的方法.编译时似乎不可能.我以为我有一个运行时解决方案(见下面的代码),但它也没有完全编译 我正在开发一个项目,其中某些对象被引用计数 – 它与COM的设置非常相似.无论如何,我们的项目确实有智能指针,可以减少为这些对象显式调用Add()和Release()的需要.问题是,有时,开发人员仍然使用智能指针调用Release().

我正在寻找的是一种从智能指针调用Release()创建编译时或运行时错误的方法.编译时似乎不可能.我以为我有一个运行时解决方案(见下面的代码),但它也没有完全编译.显然,使用operator->()后不允许隐式转换.

无论如何,任何人都可以想到一种方法来完成我想要完成的任务吗?

非常感谢您的帮助!

凯文

#include <iostream>#include <cassert>using namespace std;class A{public:    voID Add()    {        cout << "A::Add" << endl;    }    voID Release()    {        cout << "A::Release" << endl;    }    voID Foo()    {        cout << "A::Foo" << endl;    }};template <class T>class MySmartPtrHelper{    T* m_t;public:    MySmartPtrHelper(T* _t)        : m_t(_t)    {        m_t->Add();     }    ~MySmartPtrHelper()    {        m_t->Release();     }    operator T&()    {        return *m_t;    }    voID Add()    {        cout << "MySmartPtrHelper::Add()" << endl;        assert(false);    }    voID Release()    {        cout << "MySmartPtrHelper::Release()" << endl;        assert(false);    }};template <class T>class MySmartPtr{    MySmartPtrHelper<T> m_helper;public:    MySmartPtr(T* _pT)        : m_helper(_pT)    {    }    MySmartPtrHelper<T>* operator->()    {        return &m_helper;    }};int main(){    A a;    MySmartPtr<A> pA(&a);    pA->Foo(); // this currently fails to compile.  The compiler               // complains that MySmartPtrHelper::Foo() doesn't exist.    //pA->Release(); // this will correctly assert if uncommented.    return 0;}
解决方法 你不能这样做 – 一旦你超载了 *** 作符 – >你被卡住了 – 重载的运算符会以同样的方式运行,而不管它是什么.

您可以将Add()和Release()方法声明为private,并使智能指针成为引用计数类的朋友.

总结

以上是内存溢出为你收集整理的c – 智能指针是否可以选择性地隐藏或重定向对它们包装的对象的函数调用?全部内容,希望文章能够帮你解决c – 智能指针是否可以选择性地隐藏或重定向对它们包装的对象的函数调用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238983.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存