我创建了一个"智能变体"标准结构 - 系统提供的struct canmsg
,从can设备读取该类型的数据,我经常处理这些帧。
现在,为了更容易处理它们,我创建了一个子类:class TCanFrame : public canmsg
。它没有任何额外的属性,但它有一堆方法 - 一个友好的构造函数,用于从头开始创建框架,命令和数据,读取器和设置器,读取和设置不同的属性"上面的抽象层&# 34; (例如,以数据编码的频道子地址)。
从struct canmsg_t
的实例构造TCanFrame类型的对象的最佳方法是什么?我可以从&source
到this
执行memcpy吗?或者我需要逐个字段地复制它吗?或者其他一些技巧来创建一个整洁的TCanFrame实例来自" dumb" canmsg
或者我可以让复制构造函数接受父类吗?
答案 0 :(得分:6)
如果您没有添加任何数据成员,并且不需要访问canmsg
的任何受保护成员,我认为您不应该创建派生类。相反,您可以添加自由函数以在定义canmsg
的命名空间中执行额外功能,然后将它们与普通canmsg
对象一起使用。您可以阅读更多关于课程"非会员界面"以及为什么它在例如这些文章由Scott Meyers和Herb Sutter组成。
另请注意,如果您确实创建了派生类并且canmsg
没有虚拟析构函数,则可以通过调用delete
上的canmsg*
轻松地遇到未定义的行为它实际上指向TCanFrame
对象。
答案 1 :(得分:4)
您可以使用编译器提供的默认复制构造函数:
TCanFrame(const canmsg& msg) : canmsg(msg) {}