从基类构造对象"dumb"

Construct object from "dumb" base class

本文关键字:dumb 对象 基类      更新时间:2023-10-16

我创建了一个标准结构的"智能变体"——系统提供了struct canmsg,这种类型的数据是从can设备读取的,我经常处理这样的帧。

现在,为了更容易地处理它们,我创建了一个子类:class TCanFrame : public canmsg。它没有任何额外的属性,但它有一堆方法——一个友好的构造函数,用于从头开始创建帧,命令和数据,getter和setter,用于读取和设置"上面的抽象层"的不同属性(例如,数据中编码的通道子地址)。

struct canmsg_t的实例构造TCanFrame类型的对象的最佳方法是什么?我可以做一个从&sourcethis的记忆吗?或者我需要一个字段一个字段地复制它?或者其他一些技巧,用"dumb"canmsg创建一个整洁的TCanFrame实例,或者我可以让复制构造函数接受父类吗?

如果您不添加任何数据成员,也不需要访问canmsg的任何受保护成员,我认为您不应该创建派生类。相反,您可以在定义canmsg的命名空间中添加免费函数来执行额外的功能,然后将它们与普通的canmsg对象一起使用。您可以在Scott Meyers和Herb Sutter的这些文章中了解更多关于类的"非成员接口"以及为什么它是一件好事。

还要注意,如果您确实创建了一个派生类,并且canmsg没有虚拟析构函数,那么通过在实际上指向TCanFrame对象的canmsg*上调用delete,您可以很容易地遇到未定义的行为。

您可以使用编译器提供的默认复制构造函数:

TCanFrame(const canmsg& msg) : canmsg(msg) {}