2

C++ では、クラス内で使用されるいくつかの文字列を定義したいと思いますが、値はすべてのインスタンスで共通になります。CI では s を使用していたでしょう#define。これがその試みです:

#include <string>
class AskBase {
public:
    AskBase(){}
private:
    static std::string const c_REQ_ROOT = "^Z";
    static std::string const c_REQ_PREVIOUS = "^";
    static std::string const c_REQ_VERSION = "?v";
    static std::string const c_REQ_HELP = "?";
    static std::string const c_HELP_MSG = "  ? - Help\n ?v - Version\n ^^ - Root\n  ^ - Previous\n ^Z - Exit";
};
int main(){AskBase a,b;}

C++0x が必要な場合、それは許容されます。

4

4 に答える 4

10

次のように、単一の翻訳単位 (ソース ファイル) で個別に定義する必要があります。

//header
class SomeClass
{
  static const std::string someString;
};

//source
const std::string SomeClass::someString = "value";

完全にはわかりませんが、新しい C++1x 標準ではこれが修正されると思います。

于 2009-06-07T22:04:59.553 に答える
2

クラス内で文字列定数が必要な場合は、クラス自体には入れませんが、次のいずれかです。

1) ヘッダーで公開する必要がある場合は、次のようにクラスの外 (適切な場合は名前空間) に配置します。

const char * const c_REQ_ROOT = "^Z";
...

2) そうでない場合は、cpp ファイルの匿名名前空間に配置します。

その後、同じヘッダー ファイル内の複数の関連コンポーネントから文字列定数をグループ化することもできます。

これは最も「アカデミックな」方法ではないかもしれませんが、コードはよりシンプルでリファクタリングしやすくなっています。文字列定数を静的クラスメンバーとして定義する実際の利点は見つかりませんでした。

ここにいる他のプログラマーの意見に非常に興味があるので、遠慮なくコメントを残してください。

于 2009-06-08T08:35:00.800 に答える
0

私はその構造を決して使用しません。
開発者の1人がコードをリファクタリングして、書き込みを開始した場合:

   // header
   class StringBug
   {
        static const std::string partOfTheString;
        static const std::string wholeString;
   };

   // source
   const std::string StringBug::partOfTheString = "Begin ";
   const std::string StringBug::wholeString = partOfTheString + "and the rest";

partOfTheStringがwholeStringの作成に使用される前に初期化されるという保証がないため、プログラムにバグを見つけるのは非常に困難です。

クラス共通文字列を作成したい場合は、次のようにします。

// header
class StringBug
{
    static const std::string& partOfTheString() {
       static const std::string sPartOfTheString("Begin ");
       return sPartOfTheString;      
    }

    static const std::string& wholeString() {
       static const std::string sWholeString( partOfTheString() + "and the rest");
       return sWholeString;
    }
};
于 2009-06-08T07:52:36.063 に答える
0

ウィキペディアの記事によると、これはサポートされているはずですが、 State of C++ EvolutionページでC++0x参照が見つかりません。

于 2009-06-08T08:34:00.070 に答える