سؤال

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

في صفي ، تحت الأماكن العامة ، أعلنت ذلك على النحو التالي:

static struct tm *dataTime;

في MAIN.CPP ، حاولت تحديده وتهيئته مع وقت النظام مؤقتًا لاختبار (الوقت الفعلي المراد إدخاله في وقت التشغيل)

time_t rawTime;
time ( &rawTime );
tm Indice::dataTime = localtime(&rawTime);

ولكن يبدو أنني لا أستطيع استخدام الوقت () خارج الوظائف.

Main.cpp: 28: خطأ: مُنشئ متوقع ، أو تدمير ، أو نوع تحويل من قبل "('الرمز المميز

كيف يمكنني تهيئة القيم في TM ثابت للفئة؟

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

المحلول

يمكنك لف ما سبق في وظيفة:

tm initTm() {
    time_t rawTime;
    ::time(&rawTime);
    return *::localtime(&rawTime);
}

tm Indice::dataTime = initTm();

لتجنب المشكلات المحتملة ، اجعل الوظيفة ثابتة أو وضعها في مساحة اسم لم يكشف عن اسمها.

نصائح أخرى

struct tm get_current_localtime() {
    time_t now = time(0);
    return *localtime(&now);
}

struct tm Indice::dataTime = get_current_localtime();

قم بلف كل شيء في وظيفة ، واستخدم ذلك لتهيئة عضويتك الثابتة:

tm gettime() {
    time_t rawTime;
    time ( &rawTime );
    return localtime(&rawTime);
}

tm Indice::dataTime = gettime();

ولا تحتاج إلى (وبالتالي لا ينبغي) استخدام البادئة مع الاستخدام struct في C ++: tm يكفي ، لا struct tm بحاجة.

لا يمكنك استدعاء الوظائف بشكل تعسفي للوظائف الخارجية. إما أن تفعل التهيئة في الخاص بك main() وظيفة ، أو إنشاء فئة غلاف حول tm بنية مع مُنشئ يقوم بالتهيئة.

لاحظ أيضًا أن struct tm هو مؤشر لهيكل TM. العودة من LocalTime هي مؤشر Singleton الذي ستتغير محتوياته عندما تقوم أنت أو أي شخص آخر بالاتصال المحلي مرة أخرى.

اضف هذا:

namespace {
  class Initializer {
    public:
      Initializer() { 
        time_t rawtime; time(&rawtime);
        YourClass::dataTime = localtime(&rawtime);
      }
  };
  static Initializer myinit();
}

عند تهيئة ملف الكائن في وقت التشغيل ، يتم استدعاء مُعالج المنشئ () والذي يقوم بعد ذلك بتعيين Datatime "العالمي" كما تريد. لاحظ أن بناء مساحة الاسم المجهولة يساعد في منع الاشتباكات المحتملة لمهياج الأسماء و myinit.

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