第172-176页,A.接口设计备选方案,Stroustrup-CPL-3E



在第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(驱动程序)中包含;第二个命名空间进入implementer.h,并包含在parse.cpp中?这就是为什么他说:

"编译器没有足够的信息来检查一致性名称空间""的两个定义之一

  • 因为implementation.h和user.h都不能包含在"Parser implementation"(parse.cpp)中

172.png173.png

在174页,他有:

  namespace Parser {   //interface for implementers
    // ...
    double expr(bool);
   // ...
  }
  namespace Parser_interface { //interface for users
    using Parser::expr;
  }

上层命名空间进入implementer.h,下层命名空间进入user.h

在他的"dependency graph"中,他是否重申了一个显而易见的事实:当Make运行时,对"Parser"(parser.cpp/implementer.h)的任何更改都将导致driver/main.cpp被重新构建——这是不必要的?

174.png

http://groups.google.com/group/alt.comp.lang.learn.c-c++/browse_thread/thread/3be9f35f2969f311/0d418ec6138a7e58#0d418ec6138a7e58

(关于编译器一致性的部分是错误的,上面的线程说明了原因:是的,实现可以而且应该做到这一点,但是一致性只在一定程度上起作用。如果user.h使用的东西如果没有在那里声明,你会得到诊断。如果你有"double"expr(布尔);"在一个位置声明"one_answers"float expr(bool);"在另一个中编译器还应该为您提供诊断。但是,如果您更改第二个是"float expr(int);",那么这只是一个重载完全合法的C++。-Ulrich Eckhardt)

我相信你所有三个问题的答案都是"是的"

相关内容

  • 没有找到相关文章

最新更新