加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Objective-C类的构造或技术在C?

发布时间:2020-12-16 05:29:57 所属栏目:百科 来源:网络整理
导读:Objective-C类别功能允许程序员添加未在原始类定义中定义的新方法. 我可以在C上存档类似的功能(语言结构或某种技术)吗? 主要关注的是一致的方法调用语法(.或 – 运算符). 解决方法 让我们考虑下列课程的扩展: struct A { int x,y; A(int x,int y) : x(x),y
Objective-C类别功能允许程序员添加未在原始类定义中定义的新方法.

我可以在C上存档类似的功能(语言结构或某种技术)吗?

主要关注的是一致的方法调用语法(.或 – >运算符).

解决方法

让我们考虑下列课程的扩展:
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.

与Soonts的答案相反,我的解决方案也适用于添加的虚拟表,因为它不依赖于不安全的指针转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读