PG : 172-176.PARTA.Interface 디자인 대안, Stroustrup-CPL-3E
-
09-12-2019 - |
문제
172 페이지의 Stroustrup은 그렇게하는 것과 같은 것을하고 있습니다 :
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. 이는 첫 번째 네임 스페이스가 (예를 들어) user.h에 삽입되고 main.cpp에서 포함되어 있음을 의미합니다. 두 번째 네임 스페이스는 구현 자의 Spere.cpp에서 포함되어 있습니까? 그 이유는 그가 말한다 :
"컴파일러는 일관성을 확인하기에 충분한 정보가 없습니다. 네임 스페이스의 두 가지 정의 "
- 구현 자 및 user.h가 모두 "파서 구현"(parse.cpp)에 포함될 수 없으므로
172.png 173.png 174 페이지, 그는 다음과 같습니다 :
.namespace Parser { //interface for implementers // ... double expr(bool); // ... } namespace Parser_interface { //interface for users using Parser::expr; }
는 상위 네임 스페이스가 구현 자로 가고 User.h로 낮은
"
dependency graph
"는 분명히 실행되면 "Parser"(parser.cpp/implementer.h
)로 변경하면 드라이버 / main.cpp가 재구성됩니다. 불필요하게?
해결책
(컴파일러 일관성에 대한 부분이 잘못되고 위의 스레드는 왜 다음과 같이 구성됩니다. 예, 구현은 그렇게 할 수 있지만 확인해야합니다. 일관성은 어느 정도까지만 작동합니다.user.h가있는 것들을 사용하는 경우 거기서 선언되지 않아 진단을 받게됩니다.당신이 "더블 expr (bool); "한 곳에서 선언되고"float expr (bool) "; 컴파일러는 또한 진단을 제공해야합니다.그러나, 당신이 그를 바꾸면 두 번째 사람은 "float expr (int)", 이는 단지 과부하 일뿐입니다. 완벽하게 법적 C ++.- Ulrich Eckhardt)
다른 팁
세 가지 질문 모두 "예"에 대한 답변이 믿습니다.