如何在类中声明和初始化字符串数组?

3
我正在尝试在头文件中声明一个字符串数组,用于表示扑克牌中的花色,并在实现文件中进行初始化。我已经尝试过使用initializer_list以及在构造函数内部进行初始化,但都不起作用。最终我找到了这个链接:Initializing a static const array of const strings in C++,但我不明白为什么这个方法可以,而之前的方法不行。

为什么这里使用了char

static const char * const days[]

为什么要使用指针而不是string?这与IT技术有关。

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


3
请使用 std::arraystd::string 和初始化列表。 - Daniel Kamil Kozar
其他的方法是什么? - 101010
正如我的意见所述,初始化列表无法工作,我得到了一些错误提示,仅允许使用“()”。 - Ian004
@Ian004请重新阅读第一个评论 :) - Paul Evans
2个回答

11

使用 C 风格字符串的第一种方法:

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

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

实时演示

使用std::string的第二种方法:

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

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

使用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"};

实时演示


5

首先,我建议不要在类中使用字符串字面量来表示花色,如果使用简单的枚举或字符,将更容易使逻辑清晰。

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

实现这个语法的方法可以是:

static const char* const suits[4];

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

这只是语言语法与静态成员相互配合的方式。


谢谢大家,现在我对这个有了更好的理解! - Ian004

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接