pg: 172-176.PartA. Альтернативные варианты дизайна интерфейса, Stroustrup-CPL-3E - PullRequest
0 голосов
/ 09 марта 2012

На странице 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>
  }

Q1. означает ли это, что первое пространство имен вставляется (в качестве примера) в user.h и включается из main.cpp - драйвера; второе пространство имен в Implementer.h и включены из parse.cpp? Вот почему он говорит:

"компилятору не хватает информации для проверки согласованности из двух определений пространства имен "

  • потому что и Implementer.h, и user.h не могут быть включены в "реализацию Parser" (parse.cpp)?

172.png 173.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) приведет к перестройке драйвера / main.cpp - без необходимости?

174.png

Ответы [ 2 ]

1 голос
/ 14 марта 2012

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

(часть о согласованности компилятора неверна, и в приведенном выше потоке указано, почему: Да, реализация может и должна делать это, но проверка последовательность работает только в определенной степени. Если user.h использует вещи, которые не заявлено там, вы получите диагностику. Если у вас есть "двойной expr (bool); "объявлено в одном месте и" float expr (bool); "в другом Компилятор также должен дать вам диагностику. Однако, если вы измените второй «float expr (int);», тогда это просто перегрузка, которая совершенно легальный C ++. - Ульрих Экхардт)

0 голосов
/ 11 марта 2012

Я считаю, что ответы на все три ваших вопроса "да"

...