1. ホーム
  2. c++

[解決済み】静的定数文字列(クラスメンバ)

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 .