解决方法
让我们考虑下列课程的扩展:
struct A { int x,y; A(int x,int y) : x(x),y(y) {} };
你可以继承这个类或者写一个包含这个类的一个实例的包装类.在大多数情况下,继承是要走的路,因为包装类不是A,而是包裹(包含)A.
使用C11移动语义,将实例A推送到子类B(继承A)将是有效的,不需要复制实例A:
class B : public A { public: B (A &&a) : A(a),someOtherMember(a.x + a.y) {} // added public stuff: int someOtherFunction() const { return someOtherMember; } private: // added private stuff: int someOtherMember; };
全部代码示例:http://ideone.com/mZLLEu
当然,我添加的功能有点愚蠢(会员更多,因为它不尊重原始成员x和y的进一步变化),但你应该了解我想要展示的内容.
注意构造函数B(A&& a),这是我所说的“促进构造函数”(这不是一个标准术语).通常,B(B&&&)是移动构造器,其将所提供的B实例的内容移动到要被构造的新B中.我使用移动语义将A(已由另一个函数返回)的实例移动到B的超类A中.
有效地,您可以促进A到B,同时可以使用B作为A.
原文地址:https://www.jb51.cc/c/114597.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。