لا إضافة وظيفة الاعضاء الجدد في الدرجة الرابعة المؤشر كسر التوافق الثنائية؟

StackOverflow https://stackoverflow.com/questions/636110

سؤال

هل مضيفا دالة عضو جديدة في د تعريف فئة المؤشر كسر التوافق الثنائية؟

وعلى سبيل المثال، فإن تعريف جديد دون كسر التوافق ثنائي مقارنة الأصلي؟ (مسألة الجانب، وهناك أداة من شأنها أن تخبرني ما إذا كان. لذا جديدة يكسر التوافق ثنائي مقارنة. لذا القديم؟ إذا لم يكن كذلك، كيف يمكنني التحقق يدويا؟)

والأصل:

#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

ومعلوماتك: أنا أفهم ينبغي تحديد الدرجة الرابعة المؤشر في الملف سم مكعب بدلا من الرأس. المثال أعلاه هو متفق التركيز على مسألة التوافق الثنائية.

هل كانت مفيدة؟

المحلول

لا لم يحدث ذلك.

ويجب أن نفهم كيف يبني C ++ كائناتها.

في قضيتك انها مجرد تقريبا "POD" الطبقة مع وظائف عضو غير ظاهري. هؤلاء وظائف لا affet تمثيل الكائن في الذاكرة. إصدار جديد وهكذا غير ثنائي متوافقة مع العمر.

وأكتر من ذلك، إذا لم يكن لفضح بك "أبريفاتي" الطبقة إلى المستخدم. (عدم إعطاء رأس الإعلان فقط إلى الأمام)، التي لن الفرامل و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 متوافقة.

نصائح أخرى

وحاول استخدام أبي الامتثال المدقق أداة ، فإنه يتحقق الملفات رأس ويبس وتفتيش مشتركة للتغييرات ABI قد كسر التوافق الثنائية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top