将新的成员函数添加到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
Run Code Online (Sandbox Code Playgroud)
新:
#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() …Run Code Online (Sandbox Code Playgroud) Qt在开发过程中大量使用了PIMPL习惯用法:https://wiki.qt.io/D-Pointer
正如我在这里所读到的:“ d指针”源于Trolltech的Arnt Gulbrandsen,他首先将该技术引入了Qt,使其成为最早的C ++ GUI库之一,即使在更大的发行版之间也保持二进制兼容性。” 。但是没有人说“ D”代表什么。
那么“ D”在D-Pointer中代表什么?
我试图了解整个 d 指针是如何工作的。我得到了大部分零件,但我目前面临一个问题:
就像这里的Dpointer 继承人一样,我想使用 d 指针继承一个类(实际上它是 QProcess)。
由于访问 d 指针的函数是私有的,我无法通过简单的继承来访问它。我的想法是再次使用 Q_DECLARE_PRIVATE 宏来获取函数并访问它。这能行吗?在我尝试之前,我想要一些提示,因为我不知道这是否可行。
(我需要这个以避免整个许可问题。)
进程文件
#ifndef MYPROCESS_H
#define MYPROCESS_H
class QProcessPrivate;
class MyProcess : public QProcess {
public:
MyProcess(QObject *parent = 0);
protected:
Q_DECLARE_PRIVATE(QProcessPrivate);
};
#endif /* WIDGET_H */
Run Code Online (Sandbox Code Playgroud)
我的进程.cpp
#include "myprocess.h"
MyProcess::MyProcess(QObject *parent = 0)
: QProcess(parent) {
}
MyProcess::setPid(Q_PID pid) {
Q_D(const QProcess);
d->pid = pid;
}
Run Code Online (Sandbox Code Playgroud)