C ++常量静态char *数组

时间:2018-06-01 21:28:52

标签: c++ const

编辑:请注意,正如@ThomasMatthews的回答所述,最好不要将数据放入标题中。请参考他的回答。

我想在类的头文件中创建一个静态const char * const数组。例如:const static char* ar[3] = {"asdf","qwer","ghjk"};但是我收到错误。

以下是一个例子:

#include <iostream>
class test{
  static const char* const ar[3] = {"asdf","qwer","hjkl"};
}
int main(){}

这是错误:

static data member of type 'const char *const [3] must be initialized out of line

我想知道我想做的事情是否可行。我读过Defining static const integer members in class definition,我从中得到的印象是你只能用int来做。如果这是相关的,我使用的是mac,我的g ++版本如下:

Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.5.0
Thread model: posix

3 个答案:

答案 0 :(得分:2)

我建议不要将数据放入头文件中 任何包含标题的源文件都将获得数据的副本。

相反,请使用extern声明:

data.h:

extern char const * data[3];

data.cpp:

char const * data[3] = {"asdf","qwer","hjkl"};

答案 1 :(得分:1)

为静态类成员提供单独的外部定义(使用初始化程序)的需要源于这样一个事实,即C ++中的确切定义点会影响初始化的顺序和对象中导出符号的位置文件。语言希望您自己做出这些决定。

但是,为了简化那些在你不关心这些事情的情况下的事情,从C ++ 17开始你可以通过在静态成员中指定一个明确的inline关键字来完成你想要的声明

class test{
  static inline const char* const ar[] = { "asdf", "qwer", "hjkl" };
};

答案 2 :(得分:0)

即使我将所有内容放入头文件中也是如此(但在这种情况下,line_001必须在类定义块之后,如下所示)。但您也可以将line_001放入cpp文件中。

使用const指针:

login(user) {
  console.log(user.value);
  this.loginService.loginUser(user.value);
  // this.user = this.loginService.getUser();
  setTimeout(() => {
    this.user = this.loginService.getUser();
  }, 2000);
  if (this.user === undefined) {
     console.log('username or password incorrect');
  } else {
    console.log(this.user);
    this.navbar.connectComps(this.user);
    this.navbar.getCheck();
  }
}

没有const指针:

class MyClass
{
public:
    MyClass();
    static char const* const arr[3];
};



char const* const MyClass::arr[3] = {"aaaa", "bbbbb", "ccccc"};