How can you define const static std::string in hea

2020-03-01 07:05发布

问题:

I have a class that I would like to store a static std::string that is either truly const or effectively const via a getter.

I've tried a couple direct approaches
1.

const static std::string foo = "bar";

2.

const extern std::string foo; //defined at the bottom of the header like so 
...//remaining code in header
};  //close header class declaration
std::string MyClass::foo = "bar"
/#endif // MYCLASS_H

I've also tried

3.

protected:
    static std::string foo;
public:
    static std::string getFoo() { return foo; }

These approaches fail for these reasons respectively:

  1. error: in-class initialization of static data member const string MyClass::foo of non-literal type
  2. storage class specified for foo -- it doesn't seem to like combining extern with const or static
  3. many 'undefined reference to' errors generated by other parts of my code and even the return line of the getter function

The reason I would like to have the declaration within the header rather than source file. This is a class that will be extended and all its other functions are pure virtual so I currently have no other reason than these variables to have a source file.

So how can this be done?

回答1:

One method would be to define a method that has a static variable inside of it.

For example:

class YourClass
{
public:

    // Other stuff...

    const std::string& GetString()
    {
        // Initialize the static variable
        static std::string foo("bar");
        return foo;
    }

    // Other stuff...
};

This would only initialize the static string once and each call to the function will return a constant reference to the variable. Useful for your purpose.



回答2:

You can only initialize a static const value in the constructor for integer types, not other types.

Put the declaration in the header:

const static std::string foo;

And put the definition in a .cpp file.

const std::string classname::foo = "bar";

If the initialization is in the header file then each file that includes header file will have a definition of the static member. There will be linker errors as the code to initialize the variable will be defined in multiple .cpp files.