سؤال

لقد ورثت تطبيقًا كبيرًا تم كتابته في الأصل في C (ولكن في الوقت نفسه تمت إضافة الكثير من C ++ أيضًا). بسبب الأسباب التاريخية ، يحتوي التطبيق على الكثير من رميات الفراغ. قبل أن تبدأ في الاختناق ، اسمحوا لي أن أشرح لماذا تم ذلك.

يحتوي التطبيق على العديد من هياكل البيانات المختلفة ، ولكن يتم تخزينها في الحاويات "العامة". في الوقت الحاضر ، أود أن أستخدم حاويات STL المحببة لذلك ، أو سأعطي جميع هياكل البيانات فئة أساسية مشتركة ، بحيث يمكن للحاوية تخزين المؤشرات إلى الفئة الأساسية ، ولكن في الأيام القدامى؟] يلقي البنية المتصاعدة إلى مؤشر باطل.

بالإضافة إلى ذلك ، هناك الكثير من التعليمات البرمجية التي تعمل على رميات الفراغ هذه ، وتستخدم إنشاءات C غريبة للغاية لمحاكاة تعدد الأشكال في C.

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

هذا مثال على كيفية تخزين البيانات:

void storeData (int datatype, void *data);    // function prototype
...
Customer *myCustomer = ...;
storeData (TYPE_CUSTOMER, myCustomer);

هذا مثال على كيفية جلب البيانات مرة أخرى:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key);

أرغب بالفعل في استبدال جميع رميات الفراغ ببعض المؤشر الذكي (المرجعي) ، لكن لا يمكنني العثور على خدعة لأتمتة (أو على الأقل) ساعدني في التخلص من جميع الممثلين من وإلى الفراغ- مؤشرات.

أي نصائح حول كيفية العثور على أو استبدال أو التفاعل بأي طريقة ممكنة مع هذه التحويلات؟

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

المحلول 3

على ما يبدو ، لا توجد طريقة/خدعة آلية لتحويل أو العثور على جميع استخدامات الفراغ. سأضطر إلى استخدام العمل اليدوي للعثور على جميع رميات الفراغ ، بالاشتراك مع PC-Lint والتي ستمنح الأخطاء كلما كان هناك تحويل غير صحيح.

قضية مغلقة.

نصائح أخرى

أرغب بالفعل في استبدال جميع رميات الفراغ ببعض المؤشر الذكي (المرجعي) ، لكن لا يمكنني العثور على خدعة لأتمتة (أو على الأقل) ساعدني في التخلص من جميع الممثلين من وإلى الفراغ- مؤشرات.

مثل هذه إعادة البناء الآلية تحمل العديد من المخاطر.

خلاف ذلك ، في بعض الأحيان أحب أن ألعب الحيل عن طريق الخروج من مثل هذه الوظائف الفراغية وظائف القالب. الذي - التي:

void storeData (int datatype, void *data);

يصبح:

template <class T>
void storeData (int datatype, T *data);

في البداية ، قم بتنفيذ القالب ببساطة عن طريق التفاف الدالة الأصلية (المعاد تسميتها) وتحويل الأنواع. قد يسمح لك ذلك برؤية المشكلات المحتملة - بالفعل ببساطة عن طريق تجميع الكود.

ربما لا تحتاج إلى التخلص من الممثلين لاستخدام المؤشرات المشتركة.

storeData(TYPE_CUSTOMER, myCustomer1->get());

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???");

بالطبع ، يفترض هذا أنك لا تتوقع مشاركة نفس المؤشر عبر المكالمات لتخزين/جلب. بمعنى آخر ، لا يشارك MyCustomer1 و MyCustomer2 نفس المؤشر.

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