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 { private: 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.
Static constant string (class member)
Because string literals (not including std::string literals) are constants, trying to modify them—for example, str[2] = 'A' —causes a compiler error.
“static const” is basically a combination of static(a storage specifier) and const(a type qualifier). The static determines the lifetime and visibility/accessibility of the variable.
You have to define your static member outside the class definition and provide the initializer there.
First
// In a header file (if it is in a header file in your case) class A { private: 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 { private: inline static const string RECTANGLE = "rectangle"; };
No additional definition is needed.
Starting from C++20 instead of const
you can declare it constexpr
in this variant. Explicit inline
would no longer be necessary, since constexpr
implies inline
.
In C++11 you can do now:
class A { private: static constexpr const char* STRING = "some useful string constant"; };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With