C ++静态常量字符串(类成员)

我想要一个类的私有静态常量(在这种情况下是一个形状工厂)。 我想有这样的事情。

class A {
   private:
      static const string RECTANGLE = "rectangle";
}

不幸的是,我得到了C ++(g ++)编译器的各种错误,比如:

ISO C ++禁止成员'RECTANGLE'的初始化

非整型类型'std :: string'的静态数据成员的无效类内初始化

错误:使'RECTANGLE'静态

这告诉我这种成员设计不符合标准。 你如何拥有一个私有字面常量(或者也许是公共的)而不必使用#define指令(我想避免数据全局性的丑陋!)

任何帮助表示赞赏。 谢谢。


您必须在类定义之外定义静态成员,并在其中提供初始化程序。

第一

// 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";

您最初尝试使用的语法(类定义内的初始值设定项)只允许使用整型和枚举类型。


在C ++ 11中,你现在可以做到:

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

在类的定义中,你只能声明静态成员。 他们必须在班级之外定义。 对于编译时积分常量,该标准使得您可以“初始化”成员的例外。 但它仍然不是一个定义。 例如,如果没有定义,取地址将无法正常工作。

我想提一下,我没有看到使用std :: string而不是const char []的好处。 std :: string很好,但它需要动态初始化。 所以,如果你写了类似的东西

const std::string foo = "hello";

在命名空间范围内,foo的构造函数将在主启动执行之前运行,并且此构造函数将在堆内存中创建常量“hello”的副本。 除非你真的需要将RECTANGLE作为std :: string,否则你可以写

// class definition with incomplete static member could be in a header file
class A {
    static const char RECTANGLE[];
};

// this needs to be placed in a single translation unit only
const char A::RECTANGLE[] = "rectangle";

那里! 没有堆分配,没有复制,没有动态初始化。

干杯,s。

链接地址: http://www.djcxy.com/p/17297.html

上一篇: C++ static constant string (class member)

下一篇: What is a "static" function?