ص:172-176.PartA.بدائل تصميم الواجهة، Stroustrup-CPL-3E
-
09-12-2019 - |
سؤال
في الصفحة 172، يقوم ستروستروب بشيء من هذا القبيل:
namespace Parser { //interface for users
double expr(bool);
}
namespace Parser { //interface for implementers
double prim(bool);
double term(bool);
double expr(bool);
using Lexer::get_token;
<SNIP>
}
س1. هل هذا يعني أنه تم إدراج مساحة الاسم الأولى في (على سبيل المثال) user.h وتضمينها من main.cpp - برنامج التشغيل؛مساحة الاسم الثانية في Attacher.h وتم تضمينها من parse.cpp؟فهل لهذا يقول:
"ليس لدى برنامج التحويل البرمجي معلومات كافية للتحقق من اتساق التعريفين لمساحة الاسم"
- لأنه لا يمكن تضمين كل من المنفذ.h والمستخدم.h في "تطبيق المحلل اللغوي" (parse.cpp)؟
وله في الصفحة 174:
namespace Parser { //interface for implementers
// ...
double expr(bool);
// ...
}
namespace Parser_interface { //interface for users
using Parser::expr;
}
هل تنتقل مساحة الاسم العلوية إلى Implementer.h ومساحة الاسم السفلية إلى user.h
في "dependency graph
"هل يكرر ما هو واضح:أنه عند تشغيل إجراء، أي تغيير إلى "المحلل"(parser.cpp/implementer.h
) سيؤدي إلى إعادة بناء driver/main.cpp - دون داع؟
المحلول
(الجزء المتعلق بتناسق المترجم خاطئ والخيط أعلاه يوضح السبب:نعم ، يمكن للتنفيذ أن يفعل ذلك ، لكن التحقق من الاتساق لا يعمل إلا إلى حد ما.إذا كان user.h يستخدم الأشياء التي لم يتم إعلانها هناك ، فستحصل على تشخيص.إذا كان لديك "expr مزدوج (منطقي) ؛" أعلن في مكان واحد و "تعويم expr (bool) ؛" في آخر ، يجب أن يمنحك المترجم أيضًا تشخيصًا.ومع ذلك ، إذا قمت بتغيير الثاني إلى "تعويم Expr (int) ؛" ، فهذا مجرد تحميل زائد وهو C ++ قانوني تمامًا.- أولريش إيكهاردت)
نصائح أخرى
أعتقد أن الإجابات على أسئلتك الثلاثة هي "نعم"