Static constant string (class member)


I'd like to have a private static constant for a class (in this case a shape-factory).

I'd like to have something of the sort.

class A {
      static const string RECTANGLE = "rectangle";

Unfortunately I get all sorts of error from the C++ (g++) compiler, such as:

ISO C++ forbids initialization of member ‘RECTANGLE’

invalid in-class initialization of static data member of non-integral type ‘std::string’

error: making ‘RECTANGLE’ static

This tells me that this sort of member design is not compliant with the standard. How do you have a private literal constant (or perhaps public) without having to use a #define directive (I want to avoid the uglyness of data globality!)

Any help is appreciated.

12/6/2018 1:02:21 PM

Accepted Answer

You have to define your static member outside the class definition and provide the initializer there.


// In a header file (if it is in a header file in your case)
class A {   
  static const string RECTANGLE;

and then

// In one of the implementation files
const string A::RECTANGLE = "rectangle";

The syntax you were originally trying to use (initializer inside class definition) is only allowed with integral and enum types.

Starting from C++17 you have another option, which is quite similar to your original declaration: inline variables

// In a header file (if it is in a header file in your case)
class A {   
  inline static const string RECTANGLE = "rectangle";

No additional definition is needed.

2/20/2019 5:14:05 AM

In C++11 you can do now:

class A {
  static constexpr const char* STRING = "some useful string constant";

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow