Класс C ++ Сингелтона против пространств имен против открытых статических переменных - PullRequest
1 голос
/ 28 марта 2012

Какой из следующих подходов лучше всего определить глобальную переменную:

  1. публичные статические переменные класса
  2. использовать один объект класса со всеми закрытыми переменными: (singleton class)
  3. пространства имен - я должен просто использовать пространство имен.

Я не уверен, имеет ли этот вопрос смысл. Просто пытаюсь найти лучшую практику.

Код ниже не является синтаксически правильным, но я думаю, что он должен передать идею:

----------------------------------------------------------------
class Reader {
  Reader();
  Library* lib;
  static Reader* reader;
public:
  Reader* Instance () {
      if (!reader) { reader = new Reader() }
      return reader;
  }
  void setLibrary ( Library* ptr ) { lib = ptr }
  Library* getLibrary { return lib }
}

Reader* Reader::reader = NULL;

int main( ) {
  ...
  Library* lib = new Library("test");
  Reader::Instance()->setLibrary(lib);
  Reader::Instance()->getLibrary()->addCell("AND2X1");
 }

   -------------- OR -------------

class Reader {
   Reader();
public:
  static Library* lib;
}

Library* Reader::lib = NULL;

int main( ) {
  ...
  Reader::lib = new Library("test");
  Reader::lib->addCell("AND2X1");
 }

    ---------------- OR -----------------

namespace Reader {
   Library* lib = NULL;
}

int main( ) {
  ...
  Reader::lib = new Library("test");
  Reader::lib->addCell("AND2X1");
}
---------------------------------------------------------------

Я пытаюсь создать новые команды в моей программе на C ++ с помощью интерфейса TCL, используя Tcl_createCommand. Я не могу передать новые аргументы в реализацию функции В результате мне нужны глобальные переменные для доступа к некоторым моим данным внутри функции. Все решения, которые я нашел для этого, похоже, используют глобальные переменные.

Другой случай, когда мне нужно выше, - использование bison для генерации парсера. Мне нужно определить глобальные переменные для выполнения действий при использовании грамматики зубров.

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

Прототип команды создания:

Tcl_Command Tcl_CreateCommand(interp, cmdName, proc, clientData, deleteProc)

clientData позволяет связать данные с командой.Затем вы можете использовать необходимые данные, без глобальных значений!

Кстати, вы можете добавить тег tcl к этому вопросу: -)

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

Если вы хотите использовать глобальный синглтон (что вам не следует делать!

В основном:

class Foo_class {
  public:
  class bar {
    public:
    int x;
  };

  int x;
  Foo_class() { x = 2; mybar = new bar(); } // This constructor will be called on first reference to the singleton
  void set_bar(bar* what) { mybar = what; }

  bar *mybar;
};

Foo_class& Foo()
{
  static Foo_class *myclass = new Foo_class();
  return *myclass;
}

int main(void)
{
  typedef Foo_class::bar foobar;
  foobar hmph;
  hmph.x = 70;
  Foo().set_bar(hmph);
  foo().x = 7;
}
...