23

プロジェクトのさまざまなクラスで使用される文字列定数を宣言したいと思います。私は2つの選択肢を検討しています

オプション1:

#header file 
class constants{
    static const string const1;
};

#cpp file

const string constants::const1="blah";

オプション2:

#header file 
namespace constants{
    static const string const1="blah";
};

何がより良い実装になるのか疑問に思っています。

すでに見た

クラス固有の名前付き定数をC++で格納する場所

C ++で定数文字列を配置する場所:静的クラスメンバーまたは匿名名前空間


アップデート:

オプション3:

「potatoswatter」と「sellibitze」からの提案に基づいて、私は現在次の実装を持っていますか?

#header file
namespace constants{
    extern const string& const1(); //WORKS WITHOUT THE EXTERN  ***WHY***
};

#cpp file
namespace constants{
   const string& const1(){static string* str = new string ("blah"); return *str;}
}

定数を使用する必要があるヘッダーファイルをインクルードしています。この実装の主な短所はありますか?

4

4 に答える 4

12

2年後の更新:

複数のソースファイルからアクセスできるすべてのグローバルはinline、リンカーがファイル間でオブジェクトを共有し、プログラムがオブジェクトを適切に初期化するように、関数でラップする必要があります。

inline std::string const &const1() {
    static std::string ret = "hello, world!";
    return ret;
}

inline関数は暗黙的に作成され、extern必要に応じて名前空間またはクラスにラップできます。(ただし、静的メンバーを保持するためだけにクラスを使用しないでください。名前空間の方が適しています。また、リンカーを無効にし、各ソースに異なるstd::stringオブジェクトが表示されるため、匿名の名前空間を使用しないでください。)

于 2010-09-08T16:54:29.880 に答える
11

プログラム(およびバイナリ)の存続期間を通じて一定のままである文字列リテラルにメモリを動的に割り当てるリスクを冒すことに頼るすべての回答std::stringは、避ける必要があります。

Sellibitzeの答えは近づいていますが、一度宣言してから他の場所で定義するという問題があります。これはエレガントではなく、より多くの作業です。最善の方法は

namespace constants {
    const char * const blah = "blah!"
    const char * const yada = "yada yada!"
}

これは解決策です。ここでさらに説明します。

于 2013-07-29T15:46:15.563 に答える
9

ない。私はこれで行きます:

// header file
namespace constants {
extern const char const1[];
}

// cpp file
namespace constants {
extern const char const1[] = "blah";
}

const1ヘッダーファイルには、不完全な型であるが変換可能な宣言が含まれてchar const*おり、cpp-fileには、外部リンケージを持つ文字配列の定義が含まれています。のように動的な初期化はありませんstd::string。だから、それはプラスです、私見。

于 2010-09-08T20:14:44.440 に答える
4

オプション1は、オプション2と同じことを実現しますが、より厄介な方法で実行されます。

特にグローバルアクセス/定数の場合、静的メンバーのみを持つクラスを使用する場合は、名前空間を使用します。

于 2010-09-08T16:51:43.453 に答える