PG: 172-176.PARTA.Interface Design Design Alternatives, Stroustrup-Cpl-3e
-
09-12-2019 - |
Domanda
A pagina 172, Stroustrup sta facendo qualcosa del genere:
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>
}
.
Q1. Si implica che il primo spazio dei nomi viene inserito in (ad esempio) user.h e incluso da main.cpp - il conducente; il secondo spazio dei nomi in implementer.h e incluso da Parse.cpp? È per questo che dice:
."Il compilatore non ha informazioni sufficienti per verificare la coerenza delle due definizioni dello spazio dei nomi "
.
- perché entrambi gli implementer.h e user.h non possono essere inclusi in "implementazione parser" (parse.cpp)?
172.png 173.png A pagina 174, ha:
.namespace Parser { //interface for implementers // ... double expr(bool); // ... } namespace Parser_interface { //interface for users using Parser::expr; }
Lo spazio dei nomi superiore che entra in implementer.h e più basso in user.h
Nel suo "
dependency graph
" sta rifornendo l'ovvio: che quando la marca è eseguita, qualsiasi modifica a "parser" (parser.cpp/implementer.h
) comporterà il driver / main.cpp è ricostruito - inutilmente?
Soluzione
(la parte sulla coerenza del compilatore è sbagliata e il thread di cui sopra indica il motivo per cui: Sì, l'implementazione può e dovrebbe farlo, ma il controllo di La coerenza funziona solo in una certa misura.Se user.h usa cose che sono Non dichiarato lì, otterrai una diagnostica.Se hai "doppio expr (bool); "dichiarato in un unico posto e" float expr (bool); "in un altro, il Il compilatore dovrebbe anche darti una diagnostica.Tuttavia, se cambi il secondo a "float expr (int);", allora questo è solo un sovraccarico che è C ++ perfettamente legale.- Ulrich Eckhardt)
Altri suggerimenti
Credo che le risposte a tutte e tre le tue domande siano "sì"