Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个简单的消息类是否有理由使用智能指针?_C++_Oop_Pointers - Fatal编程技术网

C++ 这个简单的消息类是否有理由使用智能指针?

C++ 这个简单的消息类是否有理由使用智能指针?,c++,oop,pointers,C++,Oop,Pointers,我正在将消息类的当前实现更改为: class Message { public: Message(uint8* buffer, uint8 length) : m_contents(buffer), m_length(length) { } uint8 getLength() const {return m_length; } const uint8* getData() const { return m_contents; } protected: uint8

我正在将消息类的当前实现更改为:

class Message
{
public:
    Message(uint8* buffer, uint8 length) : m_contents(buffer), m_length(length) { }

    uint8 getLength() const {return m_length; }
    const uint8* getData() const { return m_contents; }
protected:
    uint8* m_contents;
    uint8 m_length;
};
在构造函数中只取长度,在构造函数中动态分配,在析构函数中删除

我认为应该是这样的:

Message(uint8 length) : m_length(length)
{
    m_contents = new uint8[length];
}

~Message() 
{
    delete [] m_contents;
    m_contents = NULL;
}
附加信息:消息对象将被传递到串行端口对象,串行端口对象将发送消息。它还将被子类化为多个CustomMessage类

我的问题是:在这个简单的例子中,是否有任何理由使用某种类型的智能指针?举个例子会很有帮助。谢谢

是否有任何理由使用某种类型的智能指针

实际上要看情况。考虑这个代码:

 Message m1 (1024);
 Message m2 (m1);
您是否希望
m2
成为
m1
的深度副本?是否希望
m1
m2
的底层缓冲区共享内存?或者您不希望副本以(深或其他)开头?也就是说,第二条语句应该导致编译错误吗

  • 如果希望它们共享内存,那么可以使用
    std::shared\u ptr
  • 如果您希望它们是完全不同的内存拷贝(深度拷贝),则不应使用
    shared_ptr
    ;尽管可以使用
    std::unique\u ptr
    ,但也必须实现复制语义。但是如果您使用这种情况,那么最好使用
    std::vector
    而不是实现您自己的类:

    typedef std::vector<uint8> Message;
    
    Message m1(1024);
    Message m2(m1); //m2 is a deep-copy of m1
    
    注意,在这种情况下,您必须自己实现移动语义。此举通常是有道理的,所以我不会对此发表评论


希望能有所帮助。

关于复制和分配的政策是什么。如果你 使类不可压缩,使用 智能指针。如果你支持深度复制,我不这么认为 有一个标准的智能指针可以完成这项工作;你会 必须自己执行复制和分配。或使用
std::vector
,它将为您完成所有这些。如果你支持 浅拷贝,然后
std::shared_ptr
非常适合这项工作

如果类在构造后是不可变的(如果 您已经显示了所有成员),浅拷贝或无拷贝是 干得好。坦率地说,我可能只会使用
std::string
std::vector
在这里,不用担心。它提供了深度复制 默认情况下,这可能有点过头了,但这肯定是最重要的
最简单的解决方案

只要使用一个
向量
,是的:不管是否使用智能指针,你都不应该违反第三条规则:你已经把它倒过来了:你不需要使用智能指针。在这种情况下,实际上
std::vector
(甚至
std::unique_ptr
)@NPE当你使用智能指针时,3的规则不是变成了2的规则吗;这意味着他仍然必须实现赋值运算符,而不是析构函数?
typedef std::vector Message+1很好的答案。我特别喜欢缺乏教条主义,不像有些人会感叹你必须始终使用智能指针进行测试,我完全可以接受一个没有共享内存的副本,它会导致两个完全不同的对象。Vector看起来很不错。回答很好,但你忘记了“不复制”选项。大多数情况下,如果你不支持复制,你也不想移动。(但对于这个类,值语义——深度复制或浅复制——似乎更合适,这意味着
std::shared\u ptr
std::vecdtor
)@JamesKanze真的吗<代码>移动
通常比深度复制容易得多,并使工厂函数等具有更好的语法。
Message(Message const &) = delete;
Message& operator=(Message const &) = delete;