سؤال

class logger {
 ....
};

logger& operator<<(logger& log, const std::string& str)
{
    cout << "My Log: " << str << endl;
    return log;
}

logger log;
log << "Lexicon Starting";

ويعمل بشكل جيد، ولكن أود أن استخدام مؤشر إلى مثيل فئة بدلا من ذلك. أي بمعنى.

logger * log = new log();
log << "Lexicon Starting";

هل هذا ممكن؟ إذا كان الأمر كذلك فما هو بناء الجملة؟ بفضل

وتحرير: وخطأ المترجم هو

error: invalid operands of types 'logger*' and 'const char [17]' to binary 'operator<<'
هل كانت مفيدة؟

المحلول

وكنت قد dereference المؤشر إلى كائن مسجل الخاصة بك والتحقق من الواضح ما اذا كان لا 0. شيء من هذا القبيل ينبغي القيام بهذه المهمة:


  log && ((*log) << "Lexicon starting")

وأما الجنرال جانبا، وأود أن نخجل من الأشياء الرجوع كأنه مسجل (والتي عادة ما نتوقع دون قيد أو شرط أن يكون حاضرا) عن طريق مؤشر نظرا لحالة عدم اليقين التي تحصل مع مؤشر، AKA هناك كائن أم لا؟

نصائح أخرى

وهنا هو الطريقة:

logger * log = new log();
(*log) << "Lexicon Starting";

لماذا لا تستخدم إشارة؟

logger & log = *(new log()); 
// the above is abhorrent code that 
// should be replaced by something meaningful

log << "Lexicon Starting";

وإذا لم يكن هذا ما تريد كنت اذهب مع تيمو Geusch ، حتى لو كان هو قبيح

واعتمادا على السياق حيث تحصل المسجل الخاص بك من، قد ترغب في إرجاع إشارة بدلا من مؤشر:

...
Logger& logger() {
    return *_pLogger;
}
...

Logger& log = logger();
log << "...";

وليس حقا. new log( ) ديه نوع المؤشر، "Lexicon starting" ديه اكتب const char[16]. يمكنك الزائد فقط مشغلي إذا وسيطة واحدة على الأقل لديها نوع المعرفة.

وdecasteljau احظ بشكل صحيح أنك يمكن أن تفعل ذلك عن طريق (*log)، إذا أردت المؤشر. أنا لا أحب المؤشر، ولكن. اندريه ألكساندريسكو يكرس عدد غير قليل من الصفحات على سنغلتونس مسجل الذكية في "الحديثة تصميم C ++"، قد يكون من المفيد للتشاور ذلك.

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