【问题标题】:Static constant string array, how to use [closed]静态常量字符串数组,如何使用[关闭]
【发布时间】:2012-12-30 10:47:27
【问题描述】:

如何初始化和使用静态常量字符串数组?我做了一个例子,表头:

const static string validFileTypesToSendToClient[];

实现:

const string Settings::validFileTypesToSendToClient[] = {"html","css","js"};

这可行,但我该如何使用它?例如在这种情况下:

string fileTypesToAllow[] = Settings::validFileTypesToSendToClient;

我得到错误:

Initialization with ‘{…}’ expected for aggregate object.

那么,我怎样才能以正确的方式使用字符串的静态常量数组呢?我已经找到了这个:Initializing a static const array of const strings in C++ 但他们没有描述如何使用它。

【问题讨论】:

  • 你需要一本 c++ 教科书。也就是说,c++ 中的索引与大多数其他语言中的索引相同。原始数组是不可赋值的。
  • 我忘记了 C++ 将数组放在堆栈上。我的错!

标签: c++ class static constants


【解决方案1】:

C++ 中不存在内置数组赋值。但是,您可以这样做:

#include <array>
#include <string>

std::array<std::string, 3> string_array = 
{
  "foo", 
  "bar", 
  "baz", 
};

int main()
{
  std::array<std::string, 3> second_string_array = string_array;
}

它是 C++11,但现在几乎所有编译器都支持它。 (顺便说一句,为什么您首先要复制这样的数组似乎值得怀疑。此外,这是我考虑使用 const char* 的情况之一,即使您肯定会忘记那个分配。)

【讨论】:

  • 这只是一个例子,在我的代码中我想获取数组大小。但这并没有那么好。
  • @lauw 我不太明白你的问题。如果要获取大小,只需使用 string_array.size(),或者,对于内置数组,sizeof string_array / sizeof *string_array。
  • 谢谢,成功了。但我只是在探索可能性。
【解决方案2】:

这一行:

string fileTypesToAllow[] = Settings::validFileTypesToSendToClient;

错了。 C/C++ 不允许数组赋值。您可以将数组分配给指针,但可以分配另一个数组。

【讨论】:

    【解决方案3】:

    在下一行中,您声明了一个新的字符串数组,并尝试使用另一个数组对其进行初始化。这在 C++ 中是不允许的。

    string fileTypesToAllow[] = Settings::validFileTypesToSendToClient;
    

    您应该做的是声明数组,然后将值复制过来:

    const int size = 3; // Same as the size of the Settings::validFileTypesToSendToClient array
    string fileTypesToAllow[size];
    
    for(int i = 0; i < size; i++)
    {
        fileTypesToAllow[i] = Settings::validFileTypesToSendToClient[i];
    }
    

    【讨论】:

      【解决方案4】:

      你不能将一个数组分配给另一个数组,你必须一个一个地复制元素:

       string fileTypesToAllow[3];
      
       for(int i=0; i<3; i++)
       {
          fileTypesToAllow[i] = Settings::validFileTypesToSendToClient[i];
       }
      

      要访问数组,你可以这样做:

      std::cout << Settings::validFileTypesToSendToClient[0] << std::endl;
      

      可以只使用向量而不是数组或 std::array

      struct Settings
      {
        const static std::vector<std::string> validFileTypesToSendToClient;
        static std::vector<std::string> makeData() 
        { 
          std::vector<std::string> v;
          v.push_back("html");
          v.push_back("css");
          v.push_back("js");
          return v;
        }
      };
      

      实施:

      const std::vector<std::string> Settings::validFileTypesToSendToClient = Settings::makeData();
      

      现在您可以轻松复制validFileTypesToSendToClient

      int main()
      {      
        std::vector<std::string> fileTypesToAllow = validFileTypesToSendToClient;
        return 0;
      }
      

      【讨论】:

      • 据我所知,向量不允许使用 {} 进行初始化。我试试看。
      • 这给了我这个错误:“非聚合不能用初始化列表初始化”
      • 为什么不能将 2 个问题标记为答案 :(.
      • 哈哈,它只允许一个作为最佳答案
      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多