【问题标题】:How to declare and initialize an array of strings within a class?如何在类中声明和初始化字符串数组?
【发布时间】:2014-09-12 21:32:11
【问题描述】:

我试图在我的头文件中声明一个代表一副牌中花色的字符串数组,并在我的实现文件中对其进行初始化。我试过initializer_list 并尝试在我的构造函数中初始化它,但没有任何效果。我终于遇到了这个链接Initializing a static const array of const strings in C++,但我不明白为什么这个有效而以前的方法无效。

这里为什么使用char

static const char * const days[]

而不是string?为什么要使用指针?

我很困惑为什么我不能在我的头文件中声明和初始化数组。

【问题讨论】:

  • 只需使用std::arraystd::string 和一个初始化列表。
  • 其他方法有哪些?
  • 正如我的操作中提到的,初始化列表不起作用我收到一些错误,指出只允许“()”。
  • @Ian004 请重读第一条评论 :)

标签: c++ arrays


【解决方案1】:

C 风格字符串的第一个方法:

struct Foo {
    static char const *arr[];
};

char const *Foo::arr[] = {"ace_hearts", "2_hearts", "3_hearts"};

LIVE DEMO

第二种方法std::string:

struct Foo {
    static std::string const arr[];
};

std::string const Foo::arr[] = {"ace_hearts", "2_hearts", "3_hearts"};

LIVE DEMO

std::stringstd::array 以及初始化列表的第三种方法:

struct Foo {
    static std::array<std::string, 3> const arr;
};

std::array<std::string, 3> const Foo::arr {"ace_hearts", "2_hearts", "3_hearts"};

LIVE DEMO

【讨论】:

    【解决方案2】:

    首先:我建议不要将字符串文字放入你的类中来表示西装,如果你使用简单的东西,比如枚举或字符,那么你的逻辑会容易得多。

    除此之外,这里使用指针而不是使用诸如 std::string 之类的类的原因是因为您正在存储非常简单和精确的数据(只有四种可能性,并且您不需要搜索它,或拆分它等),因此不需要 std::string 包含的所有额外功能。

    实现这一点的语法可能是:

    static const char* const suits[4];
    

    const char* 是数组的类型(它是一个 const char 指针数组,它们是 C 风格的字符串),const suits [4] 使它成为一个由四个称为 suits 的数组,不能已更改(为 const)。

    一旦在类中声明了静态成员,就必须在其他地方和在类外对其进行初始化。例如,在您的 .h 文件中,您可以编写:

    class deck{
    public:
    static const char* const suits[4];
    }
    
    const char* const deck::suits[4]={"hearts","spades","diamonds","clubs"};
    

    这就是语言语法与静态成员一起使用的方式。

    【讨论】:

    • 谢谢大家,我现在理解多了!
    猜你喜欢
    • 2011-07-12
    • 2013-10-22
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2011-05-02
    • 2016-11-05
    相关资源
    最近更新 更多