c++ 如何禁止函数返回的指向对象的指针被复制/赋值,但仍然可以访问对象的内容?

aurhwmvo  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(99)

例如,我有一个类SomeClass和两个方法SomeClass* getSomeClass()SomeClass* assignSomeClass()
我想要的是getSomeClass()给予我完全访问类的内容(变量和函数是public),但它返回的指针不应该被允许复制或赋值,例如SomeClass* ptr = getSomeClass()应该是不可能的,但getSomeClass()->func()应该工作得很好。
同样的,我希望assignSomeClass()允许指针被赋值,但是尽可能的隐藏对象的内容,或者防止它们被改变(也许比SomeClass* assignSomeClass() const更好的方法?),例如SomeClass* ptr = assignSomeClass()应该工作,但是assignSomeClass()->func()不应该。理想的情况下func()应该是完全不可见的。
我该怎么做呢?
尤其是第一种情况是我最感兴趣的。

lg40wkob

lg40wkob1#

你不能这么做,这也不是你的工作。
因为C++17保证了省略,即使你的函数返回一个带有operator->重载的不可移动的 Package 器对象,调用者仍然能够创建一个该类型的命名变量,对此你完全无能为力。
假设所讨论的指针在某种程度上被返回该指针的对象所拥有,并且您希望防止调用者将该对象长期存储在任何地方。这在语言中是无法保证的。您 * 必须 * 依赖于用户不会不正确地使用它。
另外,由于函数不能返回nullptr,因此应该返回一个引用。

相关问题