سؤال

لدي فئة حددت مشغلًا محددًا من قبل المستخدم لـ tchar*، مثل ذلك

CMyClass::operator const TCHAR*() const
{
    // returns text as const TCHAR*
}

أريد أن أكون قادرًا على فعل شيء مثل

CMyClass myClass;
_tprintf(_T("%s"), myClass);

او حتى

_tprintf(_T("%s"), CMyClass(value));

ولكن عند المحاولة ، يطبع printf دائمًا (خالية) بدلاً من القيمة. لقد جربت أيضًا مشغل char* العادي ، وكذلك الاختلافات مع const وما إلى ذلك ، فهو يعمل بشكل صحيح فقط إذا اتصلت بوضوح المشغل أو القيام بممثلين ، مثل

_tprintf(_T("%s\n"), (const TCHAR*)myClass);
_tprintf(_T("%s\n"), myClass.operator const TCHAR *());

ومع ذلك ، لا أريد أن ألقي. كيف احقق هذا؟

لاحظ أن الاحتمال هو إنشاء وظيفة تحتوي على معلمة من const tchar*، بحيث تستدعي القسري المشغل tchar*، لكن هذا لا أريد تنفيذه أيضًا.

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

المحلول

تجنب مشغلي التحويل. نادراً ما يفعلون ما تريد ، ثم المكالمات الصريحة مؤلمة. إعادة تسمية operator const TCHAR*() const ل TCHAR *str() const.

نصائح أخرى

يقول معيار C ++ أن التحويلات الضمنية مثل هذه لا يتم تطبيقها على معلمات القطع الناقص - كيف يمكن أن يعرف المترجم ما هو التحويل الذي يجب تطبيقه؟ سيتعين عليك إجراء التحويل بشكل صريح ، أو من الأفضل التوقف عن استخدام PrintF.

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

أن تكون محددًا ، عندما يرى المترجم printf("%s", foo), ، لقد مرت foo, ، مهما كان ، ل printf(), ، والتي يجب أن تفترض أنها مناسبة لـ %s تنسيق كما هو. لن يتم استدعاء أي مشغل تحويل (على الرغم من أن بعض العروض الترويجية الحسابية ستحدث).

مشغلي التحويل في مشاكل السبب العام. من خلال وجود هذا المشغل في تلك الفئة ، يمكنك التعقيد في دقة التحليل الزائد للوظائف ، حيث يمكن للمترجم تفسير أ CMyClass كما لو كانت أ TCHAR *. يمكن أن يسبب ذلك نتائج غير متوقعة ، إما أن يتسبب في تجميع التعليمات البرمجية عندما لا ترغب حقًا في ذلك ، أو تحديد الوظيفة الزائدة المحملة. (على سبيل المثال ، معطى CMyClass cmc;, ، التعبير cmc + 10 فجأة قانوني ، منذ ذلك الحين TCHAR * + int هو حساب مؤشر شرعي تمامًا.) الممارسة المعتادة هي تسمية هذه التحويلات explicit.

الصب هو الشيء الصحيح الذي يجب القيام به إذا كنت ترغب في استخدام واجهات برمجة تطبيقات نمط PrintF والاعتماد على مشغل تحويل (ولن أجادل هنا ما إذا كان يجب عليك استخدام هذه الميزات أم لا). ومع ذلك ، أود استخدام طاقم ثابت ، على سبيل المثال _tprintf(_T("%s\n"), static_cast<const TCHAR*>(myClass));

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