C++ 如何显示C++;类不';你没有指针成员吗?

C++ 如何显示C++;类不';你没有指针成员吗?,c++,C++,我有一个带有指针成员的类,类似于: class MyClass { public: void setPointer(Pointer* ptr){_pointer = ptr;} private: Pointer* _pointer{nullptr}; }; MyClass不拥有指向_指针的内存。它只有一个指针来调用所需的方法 我开始编写~MyClass(),幸运的是我意识到它不应该删除\u指针,因为它不拥有它 显示MyClass没有该指针所有权的最佳方式是什么

我有一个带有指针成员的类,类似于:

class MyClass
{
    public:
    void setPointer(Pointer* ptr){_pointer = ptr;}

    private:
    Pointer* _pointer{nullptr};
};
MyClass不拥有指向_指针的内存。它只有一个指针来调用所需的方法

我开始编写
~MyClass()
,幸运的是我意识到它不应该删除
\u指针,因为它不拥有它

显示MyClass没有该指针所有权的最佳方式是什么

编辑:

我应该在owner类中使用唯一的\u ptr,在MyClass中使用共享的\u ptr,还是两者都使用共享的\u ptr?

目前,正在讨论如何准确地表达这些语义:非拥有的被动指针。其目的另见


目前 <习惯> C++(自2011以来最新),仍然有不寻常的指针,它们拥有指向的对象。原因是
new
/
delete
有很多陷阱,但也有更好的选择,如
std::unique_ptr
std::shared_ptr
。这些不仅带来了所需的语义,而且在代码中表达了意图(分别是唯一的或共享的所有权)


最终这取决于您环境的代码风格,但我要说的是,在建立标准的最佳实践之前,
T*
对于非拥有的被动指针来说是一个很好的约定。

Coreguidelines附带了一个支持库,它是
所有者
,用于将原始指针标记为拥有

假设“原始指针”符号(例如int*)具有最大的 共同意义;也就是说,指针指向对象,但不指向对象 拥有它。所有者应转换为资源句柄(例如。, 唯一(或向量)或标记的所有者

owner<T*> // a T* that owns the object pointed/referred to; may be nullptr.
owner//T*拥有指向/引用的对象;可能是空PTR。
owner用于在无法升级的代码中标记所属指针 使用适当的资源句柄

我将其理解为:原始指针不需要标记为不拥有,因为现在原始拥有指针应该是例外。因此,它拥有需要突出显示的原始指针

当然,这只适用于始终避免在代码中拥有原始指针的情况

显示MyClass没有该指针所有权的最佳方式是什么

您存储的资源(如指向动态对象的指针)缺乏所有权,这通过不释放(删除)资源来表示。按照惯例,您永远不应该将裸标识符(如裸指针)存储到所拥有的资源中,除非存储在RAII包装器(如智能指针)中,其唯一目的是拥有和释放资源

不接受传递给您的指针的所有权是通过接受裸资源标识符(与RAII包装相反)来显示的。在提供与C兼容的接口时,或者在此类RAII包装器的构造函数/赋值中,都不能遵循此约定,因为RAII包装器确实拥有裸指针的所有权。在这种非常规情况下,必须仔细记录例外情况

通过返回一个空的资源标识符,客户机显示所有权不会转移给他们。这与C接口以及RAII包装器的接口(如果它支持释放所有权)有类似的异常

所有这些都可以通过额外的文档进行澄清


我是否应该在owner类中使用唯一的\u ptr,在MyClass中使用共享的\u ptr

否。唯一指针表示它是资源的唯一所有者。所有权不能与其他指针共享。如果使用唯一指针,则可以在
MyClass
中使用裸的非拥有指针

或者他们都应该使用共享的ptr

这是一种选择。它比unique+裸指针更安全,因为不需要保证unique指针的生存期长于裸指针的生存期。缺点是一些运行时开销。

带有注释

// A class wrapping (but not owning) a pointer.
class MyClass
{
public:
    void setPointer(Pointer* ptr){_pointer = ptr;}

private:

    // Not owned by the class
    Pointer* _pointer{nullptr};
};

说真的,不要害怕用注释记录代码。这就是它们的用途。< /P>我同意操作符,我用原始指针作为非拥有,而现代C++(代码)> STD::UNQuYYPPTR <代码>或<代码> STD::SyrdYPPTR < /C>以指示所有权。但这是一个风格和惯例的问题。如果您的编程是拥有和不拥有原始指针的混合,那么我会添加一条注释来说明它是拥有的还是非拥有的。可怜的维护程序员会感谢你(这可能是你未来的自我)。在成员指针的声明上方写
//非拥有的
也很简单。@LightnessRacesinOrbit已经这样做了,但是感觉不对。@user997112为什么不?使用智能指针应该在不删除指针的情况下解决您的问题,否则使用手动方式确保所有权,因此只有在该对象中创建而不是注入它时才可以。@muaz我应该在这两个类中使用智能指针,或者我应该在owner类中使用唯一的\u ptr,在MyClass中使用共享的\u ptr吗?不,您可以在owner类中使用
unique\u ptr
,并通过使用
get()
方法将其指向的对象传递给其他类,因此,如果
unique\u ptr
被销毁-在这种情况下,当所有者被销毁时-指向的对象将被销毁。我知道我没有正确地做什么,因此我的问题。。。。。我在问我应该怎么做才能解决这个问题?@user997112我已经告诉过你如何显示缺乏所有权。如果这不是你所做的,那么你应该做我所描述的。如果这就是你所做的,那么你已经准备好了。为了避免误解,我现在把答案改为被动。你妈妈在轨道上比赛。@Sombrero!