Python-подобное хранение статических данных в C ++? - PullRequest
0 голосов
/ 18 марта 2012

Когда у меня есть тестовые объекты данных или другие статические объекты данных, такие как строки SQL, я хочу, чтобы они не попадали в код приложения. В Python это делается с помощью отдельного исходного файла и импорта, как показано ниже. Как статические данные организованы и используются C ++?

 (file: testdata.py)
x = Foo() (an object)
x.name = "Bar"
x.number = 123
..

(file: test.py)
import testdata.py
testObject1 = testdata.x 
..

Ответы [ 4 ]

2 голосов
/ 18 марта 2012

Есть много возможностей. Это также зависит от того, что вы пытаетесь сделать (например, хотите ли вы, чтобы значения были редактируемыми после компиляции или только перед компиляцией?

Что касается последующего, вы можете использовать отдельную единицу перевода.

В некоторых заголовочных файлах:

extern const char *name;
extern const int number;

В одном отдельном исходном файле:

const char *name = "Bar";
const int number = 123;

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

Заголовочный файл:

struct Foo {
    const char *name;
    int number;
};

extern const Foo Bar;

Исходный файл:

const Foo Bar = {"Bar", 123};
2 голосов
/ 18 марта 2012

Наиболее гибким выбором для строк подключения и т. Д. Будет создание файла настроек (с выбранным вами форматом) и класса, который может читать файл, поскольку это позволяет изменять настройки без перекомпиляции программы.

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

// file.h
class Foo {
public:
    static string getBar();
private:
    static string bar;
};

// file.cpp
Foo::bar = "qwe";

static Foo::getBar() {
    return bar;
}
1 голос
/ 18 марта 2012

Существует много способов хранения данных из исходного кода.

Например, файлы конфигурации хранятся, например, в XML, хотя (к счастью) JSON получил некоторые основания (не так много, как яМне бы хотелось), и есть также пользовательские форматы.

Другой пример, для перевода вы можете использовать gettext и хранить строки в .po файлах, а также добавлять новые языки без перекомпиляции.

Itвсе работает одинаково, в конце концов:

  • вы определяете формат для файла
  • вы создаете процедуру чтения (и, возможно, записи), которая преобразует между форматом файла ив формате памяти
  • вы найдете способ передать путь к файлу программы: фиксированное имя в текущем каталоге, фиксированное имя в домашнем каталоге, аргумент командной строки, переменная среды и т. д. ...

Если вы хотите сделать это так, как вы делали это в Python, вы также можете скомпилировать ресурсы в их собственную DLL и извлекать их во время выполнения, загружая символы, изменяяrces потребует только повторной компиляции этой DLL.

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

Вы также можете поместить их в другой файл; extern объявления данных в заголовочном файле и определения в файле .cpp, например:

// Foo.h

extern Foo afoo;
extern int anint;

// Foo.cpp

Foo afoo;
int anint = 0;

Тогда вы можете #include "Foo.h" везде, где вы хотите использовать afoo и anint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...