2012-03-18 1 views
0

私はテストデータオブジェクト、またはSQL文字列のような他の静的データオブジェクトを持っているとき、私はそれらをアプリケーションコードの外に保つのが好きです。 Pythonでは、以下に示すように、別個のソースファイルとインポートでこれが行われます。静的データはどのように編成され、C++を使用していますか?これはせずに設定を変更することができますので、接続文字列などのためC++での静的データのPythonのような記憶域ですか?

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

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

"アプリケーションコードの外に"あなたの定義は正確に何ですか?テストデータを含むPythonモジュールを作成してアプリケーションにインポートする場合、そのコードはアプリケーションコードの一部ではないのですか? –

答えて

2

多くの可能性があります。また、これはあなたが何をしようとして依存する(例えば、あなたが値をコンパイルまたは以降のみについては?

をコンパイルする前に、あなたは別の翻訳単位を使用することができた後、編集可能になりたいです。

でいくつかのヘッダファイル:

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

しかし、あなたも、クラス/構造体のアプローチを行うことができます:つの別個のソースファイルで

extern const char *name; 
extern const int number; 

ヘッダファイル:

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

extern const Foo Bar; 

ソースファイル:

const Foo Bar = {"Bar", 123}; 
+0

これは特にネームスペースの中でうまくいきます。静的なクラスメンバーよりもはるかに簡単です。 – Pete

2

最も柔軟な選択は、そのファイルを読むことができるクラス(あなた自身の選択の形式で)設定ファイルを作成することですプログラムを再コンパイルする。あなたは、コードに含める静的データについては

、あなたはクラスの静的メンバを使用することができます。

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

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

static Foo::getBar() { 
    return bar; 
} 
+1

なぜか分かりませんが、静的クラスよりも名前空間が好きです... – Griwes

+1

@Griwes:+1; Javaのように見えるし、C#は自分のC++のイディオムに悪影響を及ぼしました... :-) –

1

あなたが同様に別のファイルにそれらを置くことができます。

// Foo.h 

extern Foo afoo; 
extern int anint; 

// Foo.cpp 

Foo afoo; 
int anint = 0; 

その後、あなたは#include "Foo.h"あなたがafooanintを使用することができます任意の場所:このようなexternデータヘッダファイルで宣言、および.cppファイルで定義。

1

ソースコードのうち、データを格納するための多くの方法があります。

例えば、構成ファイルはXMLに格納されていますが、(幸いなことに)JSONにはいくつかの理由がありますが、カスタムフォーマットもあります。

翻訳の場合、gettextを使用して文字列を.poファイルに格納し、再コンパイルせずに新しい言語を追加することもできます。

それはすべての終わりに、同じように動作します:

  • をあなたはリーダー(そしておそらくライター)を作成し、ファイル
  • のフォーマットを定義するファイル形式と内との間の変換手順-ememory format
  • プログラムにファイルパスを渡す方法は、カレントディレクトリの固定名、ホームディレクトリの固定名、コマンドライン引数、環境変数などです。

もしあなたがPythonでしたようにしたいのであれば、リソースを自分のDLLにコンパイルし、シンボルをロードしている間にそれらを実行時にプルすることもできます。 。

+0

DLLテクニックの簡単な例を載せることができますか? – Pete

+1

@Pete:あなたが望むかもしれないすべてのエンティティの 'extern'宣言でヘッダを作成するだけです(あるいは、安定したABIのために、文字列識別子を取る簡単な' get'関数と言語のようなカスタマイズオプションかもしれません) 、次に定義を含み、リンクする単一の動的ライブラリに一緒にリンクされたソースファイル(または複数)が含まれています。 –

関連する問題