سؤال

أنا أعمل حاليا على محرك العفريت في C ++. لدي فئة مجردة IENGINE مع وظيفة افتراضية init_api. هذا يأخذ في الفراغ *.

    //  Initialise the engines' API
//  api_params - void* to api parameters for initalisation
//  hWnd - window handle
virtual bool init_api( void* api_params, HWND hWnd ) = 0;

ثم لدي DirectX Directs Class Cencing Cenginedx. مما يؤدي ذلك بعد ذلك إلى API_PARAMS إلى D3DPresent_Parameters *، لذلك يمكن استخدامه لتهيئة DirectX.

//  Cast api_params to a D3DPRESENT_PARAMETERS
D3DPRESENT_PARAMETERS* presentParams = NULL;
presentParams = reinterpret_cast< D3DPRESENT_PARAMETERS* >( api_params );

أنا سعيد جدا بهذا الإعداد ولكن أراد الحصول على بعض المبرمجين الآخرين عرض على هذا "الحل" إذا أردت.

هتافات للردود!

كارل

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

المحلول

هناك طريقة أخرى للقيام بها هي مجرد رأس مشترك وملفات مختلفة *cpp لكل تطبيق. بهذه الطريقة يمكنك تضمين D3D فقط أو فقط ملفات OGL في مشروعك. IMO من الأفضل اختيار API في تجميع الوقت حتى لا تربطك مقابل المكتبات.

بالنسبة للفراغ *، أنا لا أحب ذلك حقا. أعتقد أنك ستكون أفضل حالا بتحديد الأنواع الخاصة بك ثم رسم خرائطها لأنواع API مع الهيكل / الفئات المجمع و TypeDefs. يمكنك إعادة توجيهها إلى إعادة توجيه هذه، ووضع التنفيذ الفعلي في ملفاتك * .cpp.

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

نصائح أخرى

هذه مشكلة شائعة نسبيا مع تباين أنواع الوسيطة في التسلسلات الهرمية للميراث؛ الفئة الفرعية الخاصة بك تريد تخصص نوع "API_PARAMS" من الطبقة الأصل.

أعتقد أن هذا لا بأس به ولكن يشبه C. أعتقد أن الحل الأفضل سيكون لجعل init_api غير الظاهري وتنفيذها بالنوع الصحيح في الفئة الفرعية. على أي حال، على الأرجح D3DPRESENT_PARAMETERS الهيكل يجعل معنى فقط مع محرك DirectX، فلماذا لا يكون لديك في الفئة الفرعية التي ينتمي إليها منطقيا؟

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

template<class T>
struct Engine {
   bool init_api(const T& params, HWND hWnd);
};

//specialize for DirectX
template<>
struct Engine <D3DPRESENT_PARAMETERS> {
  bool init_api(const D3DPRESENT_PARAMETERS& params, HWND hWnd) {
    return true;
  }
};

ولكن، استخدم شيئا يناسب المخطط الكبير للأشياء.

أنا حقا أحب هذا API هذا. لماذا استخدام مؤشر الفراغ؟ لماذا لا تجعل المعلمة الأولى مؤشر أو مرجع إلى D3DPRESENT_PARAMETERSب أنت تعرف أن هذا هو ما يجب أن يكون على أي حال؟ هذا هو أكثر آمنة من النوع.

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