سؤال

أنا باستخدام اثنين من المكتبات المختلفة في المشروع ، وكلاهما العرض مستطيل الأساسية struct.المشكلة مع ذلك هو أن يبدو أن هناك أي طريقة لادخال التحويل بين أنواع, لذلك أنا لا يمكن استدعاء دالة في مكتبة واحدة مع النتيجة من خلال وظيفة في الآخر.إذا كنت مؤلف من أي من هذه ، يمكن إنشاء تحويلات من الخارج ، لا أستطيع.

المكتبة:

typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;

مكتبة ب:

class Rect {
  int x; int y; int width; int height;
  /* ... */
};

الآن, أنا لا يمكن أن تجعل محول class, لأن C++ فقط ابحث عن التحويل في خطوة واحدة.وربما هذا هو شيء جيد لأنه سيكون هناك الكثير من الاحتمالات التي تنطوي على خلق كائنات جديدة من جميع أنواع أنواع.

أنا لا يمكن أن تجعل المشغل أن يأخذ struct من a واللوازم كائن من class من b:

foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function

لذا هل هناك طريقة معقولة حول هذا ؟

تحرير:

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

edit2:

في الواقع ، فإن أيا من الاقتراحات حقا الإجابة الفعلية السؤال ، كونراد رودولف يبدو أن يكون صحيحا.C++ في الواقع لا يمكن أن تفعل هذا.مقرف, ولكن صحيح.(إذا كان هناك فرق, انا ذاهب الى محاولة subclassing كما اقترح CodingTheWheel.

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

المحلول

إذا كنت لا تستطيع تعديل الهياكل ثم لديك أي بديل الكتابة اليدوية وظيفة التحويل بسبب الحمولة الزائدة التحويل مشغلي يعمل فقط داخل الطبقة الجسم.لا توجد طريقة أخرى.

نصائح أخرى

إنشاء وسيطة شيم نوع "RectangleEx"،و تحديد مخصص التحويلات من/إلى 3-حزب أنواع السلاسل.كلما كنت أتحدث إلى أي API, القيام بذلك من خلال شيم الدرجة.

طريقة أخرى أن اشتقاق class إما من rect أو Rectangle, و إدراج التحويلات/منشئات هناك.

غير متأكد كيف يعقل هذا ، ولكن ماذا عن شيء مثل هذا:

class R
{
public:
    R(const rectangle& r) { ... };
    R(const Rect& r) { ... };

    operator rectangle() const { return ...; }
    operator Rect() const { return ...; }

private:
    ...
};

ثم يمكنك مجرد التفاف كل rectangle في R() و "الصواب" لن يحدث.

فإنه قد لا يكون ممكنا في الحالة الخاصة بك ، ولكن رأيت الناس تستخدم قليلا المعالج-فو لتدليك أنواع إلى التوافق.

حتى هذا يفترض أن يتم بناء واحد أو كلا المكتبات.

ومن الممكن أيضا أن كنت لا تريد أن تفعل هذا في كل شيء ، ولكن ترغب في إعادة evaulate بعض المبكرة المقرر.أو لم يكن.

لماذا لا شيء بسيط مثل هذا:(ملاحظة هذا أيار/مايو على الأرجح لن ترجمة) ولكن تحصل على هذه الفكرة...


private Rect* convert(const rectangle& src)
{
    return new Rect(src.x,src.y,src.w,src.h);
}
int main()
{
    rectangle r;
    r.x = 1;
    r.y = 2;
    r.w = 3;
    r.h = 4;

    Rect* foo = convert(&r);
    ...
    delete foo;

}

تحرير: يبدو كوكو و لدي نفس الفكرة.

إذا كان structs هي نفسها داخليا, هل يمكن أن تفعل reinterpret_cast;ومع ذلك ، يبدو أن لديك 16-بت مقابل 32-بت المجالات ، ربما كنت عالقة في تحويل كل مكالمة أو كتابة مغلفة لجميع وظائف واحدة من المكتبات.

ربما يمكنك محاولة ذلك مع المشغل الحمولة الزائدة ?(ربما = المشغل وهي ليست طريقة صفك) ?

المستطيل المشغل= (const المستطيل&,const المستطيل&)

المزيد عن هذا في لغة البرمجة C++ من قبل Bjarne Stroustrup أو ربما في هذه الصفحة: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

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