当前位置:  开发笔记 > 编程语言 > 正文

将新成员函数添加到d指针类中断二进制兼容性?

如何解决《将新成员函数添加到d指针类中断二进制兼容性?》经验,为你挑选了1个好方法。

将新的成员函数添加到d指针类定义中会破坏二进制兼容性吗?

例如,下面的新定义是否会破坏与原始定义相比的二进制兼容性?(附带问题,是否有一个工具可以告诉我,如果新的.so打破二进制兼容性与旧的.so相比?如果没有,我该如何手动检查?)

原版的:

#ifndef __TESTBC_H__
#define __TESTBC_H__
class APrivate;

class A
{
  public:
   int get() { d->update(); return _d->get(); }

private:
   APrivate *_d;

};

class APrivate
{
  public:
   int get() { return _val; }
   void update() { _val = 1; }

  private:
   int _val;
};
#endif

新:

#ifndef __TESTBC_H__
#define __TESTBC_H__
class APrivate;

class A
{
  public:
   int get() { _d->update(); return _d->get(); }

private:
   APrivate *_d;

};

class APrivate
{
  public:
   int get() { return _val; }
   void update() { _val = 1; multiply(); }
   void multiply() { _val = _val * 10; }

  private:
   int _val;
};
#endif

仅供参考:我理解d指针类应该在cc文件而不是标题中指定.上面的例子是专注于二进制兼容性问题.



1> Artyom..:

不,不是的.

您应该了解C++如何构建其对象.

在你的情况下,它几乎是"POD"类,具有非虚拟成员函数.这些函数不支持对象在内存中的表示.因此新版本与旧版本二进制兼容.

更重要的是,如果您没有向用户公开您的"APrivate"类.(不提供标题只是前向声明),即使你做了很多更改,也不会制动API.

含义:

#ifndef YOUR_PUBLIC_API
#define YOUR_PUBLIC_API
class bar;
class foo {
public:
    // member functions using bar
private:
    bar *bar_;
};
#endif

你甚至没有暴露,bar所以你可以以任何你想要的方式改变它.这是使C++库ABI兼容的最佳方法.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有