Вложенные пространства имен в C ++

Для запуска javascript можно использовать внешнюю библиотеку, такую ​​как RHINO или NASHORN. И javascript может оценивать простую формулу без парсинга строки. Не влияет на производительность, если код написан хорошо. Ниже приведен пример с RHINO -

public class RhinoApp {
    private String simpleAdd = "(12+13+2-2)*2+(12+13+2-2)*2";

public void runJavaScript() {
    Context jsCx = Context.enter();
    Context.getCurrentContext().setOptimizationLevel(-1);
    ScriptableObject scope = jsCx.initStandardObjects();
    Object result = jsCx.evaluateString(scope, simpleAdd , "formula", 0, null);
    Context.exit();
    System.out.println(result);
}
30
задан nonsensickle 22 July 2014 в 02:40
поделиться

2 ответа

Это зависит от пространства имен, в котором вы уже находитесь:

Если вы не находитесь в пространстве имен или в другом несвязанном пространстве имен, тогда вы должны указать весь путь ABC :: XYZ :: ClassA .

Если вы находитесь в ABC , вы можете пропустить ABC и просто написать XYZ :: ClassA .

Также стоит упомянуть, что если вы хотите обратиться к функции, которая не находится в пространстве имен (или «корневом» пространстве имен), вы можете добавить к ней префикс :: :

Пример:

int foo() { return 1; }

namespace ABC
{
  double foo() { return 2.0; }

  void bar()
  {
    foo(); //calls the double version
    ::foo(); //calls the int version
  }
}
48
ответ дан 27 November 2019 в 22:20
поделиться

Если myobject объявлен в этом пространстве имен, и вы хотите объявить это снова (для определения), вы делаете это, добавляя префикс его имени, а не его типа.

ClassA ABC::XYZ::myobject;

Если его тип также объявлен в этом пространстве имен, вам также необходимо добавить префикс к имени типа

ABC::XYZ::ClassA ABC::XYZ::myobject;

Редко нужно повторно объявлять такой объект. Часто первое объявление объекта также является его определением. Если вы хотите сначала объявить объект, вы должны сделать это в этом пространстве имен. Следующее объявляет и определяет «myobject»

namespace ABC {
  namespace XYZ {
    ClassA myobject;
  }
}

. Если вы определили в объекте, подобном этому, вы обращаетесь к нему, говоря ABC :: XYZ . Вам не нужно каким-то образом «объявлять» этот объект, чтобы использовать его локально

void f() {
  ABC::XYZ::myobject = someValue;

  // you *can* however use a using-declaration
  using ABC::XYZ::myobject;
  myobject = someValue;
}
5
ответ дан 27 November 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: