新しいメンバー関数を 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
参考:ヘッダーではなく、ccファイルでdポインタークラスを指定する必要があることを理解しています。上記の例は、バイナリ互換性の問題に焦点を当てるために考案されました。