15

私はCocos2D-Xゲームを書いています。このゲームでは、プレーヤー、敵、その他のキャラクターが属性をに格納しますCCMutableDictionary。これは、のデコレータクラスのようなものですstd::map<std::string, CCObject*>CCMutableDictionary::objectForKey(const std::string& key)ディクショナリの値には、メソッドを介してアクセスできます。

さて、私の.cppファイルの多くに含まれているヘッダーファイルにはconst char * const、次のように、辞書の値にアクセスするためのいくつかの文字列があります。

// in Constants.h
const char* const kAttributeX = "x";
const char* const kAttributeY = "y";

// in a .cpp file
CCObject* x = someDictionary->objectForKey(kAttributeX);

ですから、私が間違っている場合は訂正してください。ただし、std::stringのコピーコンストラクターが呼び出されており、上記のメソッドのいずれかを使用して上記のメソッドstd::stringの1つを呼び出すたびに、一時的なものがスタックにあります。objectForKeyconst char* const

std::stringもしそうなら、それらの定数属性キーがすでにオブジェクトである場合、実行時に効率的であると思います。しかし、どうすればそれを正しい方法で行うことができますか?

次のようにConstants.hファイルでそれらを定義すると、正常にコンパイルされますが、何かが正しくないように感じます。

// in Constants.h
const std::string kAttributeX = "x";
const std::string kAttributeY = "y";

この質問がすでに行われている場合は、お詫び申し上げます。StackOverflowで探していた正確な答えが見つからなかったようです。

4

2 に答える 2

29

少なくとも1つのソースファイル内#includeのファイルのみであるため、作成したコードは完全に問題ありません。Constants.h複数のソースファイルでヘッダーファイルを使用する場合、同じ変数が複数回定義されます。ヘッダーファイルでの定数の正しい使用法は、変数の宣言Constants.hを含むヘッダー()と変数の定義を含むソースファイル( )にそれらを分割することです。Constants.cpp

ヘッダーファイル:

#ifndef CONSTANTS_H
#define CONSTANTS_H

extern const std::string kAttributeX;
extern const std::string kAttributeY;

#endif

ソースファイル:

const std::string kAttributeX = "x";
const std::string kAttributeY = "y";
于 2012-04-18T02:22:30.583 に答える
3

2番目のオプションでは、すべての変換ユニット(ヘッダーを含むcppファイル)で各変数が作成されます。これにより、コードサイズがわずかに増加し、実行時のコストが少し追加されます(起動時にすべての文字列を作成し、処理中に破棄します)。終了)。

Joachimによって提案された解決策は機能しますが、変数を個別に宣言および定義するのは少し手間がかかります。私は個人的に自分自身を繰り返すのが嫌いです、また私は同じことを何度も繰り返すのが好きではありません...

C ++でこれを適切に解決する方法はわかりませんが、私が使用したコンパイラはすべて__declspec( selectany )、ヘッダーファイルで変数を定義し、インスタンス化されるオブジェクトを1つだけ(変換ごとに1つではなく)できるようにするためのようなものをサポートしています。単位)。

__declspec( selectany ) extern const std::string kAttributeX = "x";

(理由については、両方externこの回答constを参照してください)。

プロセスの起動時にすべてのグローバル変数の初期化価格を支払うという欠点があります。これは101%の時間(2%を与えるか取る)許容できますが、怠惰なオブジェクトを使用することでこれを回避できます(私はここに似たようなものについて書いています)。

于 2015-02-22T13:27:30.703 に答える