[解決済み】静的定数文字列(クラスメンバ)
2022-03-23 02:42:46
質問
あるクラス(この場合はシェイプファクトリー)にプライベートな静的定数を持たせたいのですが、どうすればよいですか?
そのようなものが欲しいのですが。
class A {
private:
static const string RECTANGLE = "rectangle";
}
残念ながら、C++(g++)コンパイラからは、次のような様々なエラーが出ます。
ISO C++は、以下の初期化を禁じています。 メンバー 'RECTANGLE'
非整数型 'std::string' の静的データメンバの無効なクラス内初期化
error: 'RECTANGLE' を静的にすること
これは、このようなメンバー設計が規格に準拠していないことを物語っていますね。どうすれば、#defineディレクティブを使わずにプライベートなリテラル定数(あるいはパブリック)を持つことができるでしょうか(データのグローバル性の醜さを避けたいのです!)。
どんなことでもご相談ください。
解決方法は?
クラス定義の外部でstaticメンバを定義し、そこにイニシャライザを指定する必要があります。
最初に
// In a header file (if it is in a header file in your case)
class A {
private:
static const string RECTANGLE;
};
そして
// In one of the implementation files
const string A::RECTANGLE = "rectangle";
元々使おうとしていた構文(クラス定義内のイニシャライザー)は、integral型とenum型でのみ使用可能です。
C++17以降では、元の宣言とよく似た別のオプションがあります。
// In a header file (if it is in a header file in your case)
class A {
private:
inline static const string RECTANGLE = "rectangle";
};
追加の定義は必要ありません。
の代わりにC++20からスタート。
const
を宣言することができます。
constexpr
をこのバリアントで使用します。明示的な
inline
はもはや必要ありません。
constexpr
を意味します。
inline
.
関連
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】C++で文字列定数を定義するには?[重複している]
-
[解決済み] クラステンプレートでの静的メンバ初期化