web-dev-qa-db-ja.com

C ++で文字列定数を定義するにはどうすればよいですか?

重複の可能性:
C++静的定数文字列(クラスメンバー)
初期化された静的const C++クラスメンバーは、リンク時に重複シンボルエラーを示します

C++での私の経験は、文字列クラスの追加よりも前から存在していたため、いくつかの点でやり直しています。

クラスのヘッダーファイルを定義していて、URLの静的定数を作成します。私は次のようにしてこれを試みています:

#include <string>
class MainController{
private:
    static const std::string SOME_URL;
}

const std::string MainController::SOME_URL = "www.google.com";

しかし、これはリンク中に重複した定義を与えます。

どうすればこれを達成できますか?

18
Thom

移動します

const std::string MainController::SOME_URL = "www.google.com";

cppファイルに。ヘッダーにある場合、それを含むすべての.cppにコピーがあり、リンク中に重複したシンボルエラーが発生します。

13
David Nehme

あなたはラインを置く必要があります

const std::string MainController::SOME_URL = "www.google.com";

one-definition rule のため、ヘッダーではなくcppファイル内。また、クラスで直接初期化できないのは、std::stringは(intのような)整数型ではありません。

または、ユースケースによっては、静的メンバーを作成せずに、代わりに匿名の名前空間を使用することを検討できます。 この投稿のpro/consを参照

11
JRL

ヘッダーファイルでクラスを定義します。

//file.h
class MainController{
private:
    static const std::string SOME_URL;
}

そして、ソースファイルで:

//file.cpp
 #include "file.h"

const std::string MainController::SOME_URL = "www.google.com";
3
Nawaz

const std::string MainController::SOME_URL = "www.google.com";定義を、ヘッダーではなく単一のソースファイルに入れます。

2
Mark B