gpt4 book ai didi

c++ - 将 const char[] 初始化为非静态类成员

转载 作者:行者123 更新时间:2023-12-04 08:28:00 25 4
gpt4 key购买 nike

class foo {
public:
const char name[100];

foo(const char name[]) : name(name) {};
};

int main(){
foo("test");

return 0;
}
不编译。我如何初始化 const char[]非静态类成员?

最佳答案

您有不同的选择,具体取决于您想要实现的目标。
C++ 中的数组是奇怪的野兽,它们的行为不像大多数其他类型,特别是它们衰减为指针并且没有复制构造函数(除非包含在结构/类中)。foo(const char name[])不按值/按拷贝获取数组,它需要一个指针(是的,语法令人困惑)。
因此name(name)正在尝试用指针初始化数组。
如果这可以编译,那么意外溢出堆栈将变得非常容易,因为不能保证指针名称指向最多 100 个元素的数组。
解决方案 1
使用更合适的构造 - 使用字符串。
从您的片段中,您似乎想存储一段文本(名为 name 的变量,使用字符串文字初始化...),因此是 std::string 或其他类似字符串的类(甚至 const char* )是一个更好的构造。

class foo {
public:
std::string name;

explicit foo(std::string name_) : name(name_) {};
};

int main(){
foo("test");
}
解决方案 2
使用更好的数组
如果您确实需要存储/复制数组,请考虑使用 std::array (c++11 起)
#include <array>

class foo {
public:
std::array<char, 100> name;

explicit foo(std::array<char, 100> name_) : name(name_) {};
};

int main(){
foo(std::array<char, 100>{"test"});
}
解决方案 3
通过 const-ref 传递数组。
在某些用例中,您确实想使用数组。
在这种情况下,您需要通过引用传递值,并使用 std::initializer_list 复制内容(从 c++14 开始,但可以在 c++11 中模拟)
#include <utility>

class foo {
template <std::size_t... PACK1>
explicit foo(const char (&name_)[100], std::index_sequence<PACK1...>)
: name{ name_[PACK1]... }
{}

const char name[100];

public:
explicit foo(const char (&name_)[100])
: foo(name_, std::make_index_sequence<100>{})
{}

};

int main(){
const char hello[100] = "hello!";
foo f = foo(hello);
}
const char (&arr)[100]是由常量引用传递的长度为 100 的数组。
由于数组没有复制构造函数,我们需要使用 index_sequence初始化所有成员。
解决方案 4
使用指针并分两个阶段初始化数组。
通过常量引用传递数组意味着您需要事先创建一个如此大的数组,并且您不能传递长度不完全是 101 的字符串文字(因为 terminatig \0 )。
#include <cstring>

class foo {
const char name[100];
public:
// constructor requires copy... unsure if needs to be so
explicit foo(const char* name_)
{
std::copy(name_, name_ + std::strlen(name_), name);
}
};

int main(){
const char test[100] = "test!";
foo f = foo(test);
}

关于c++ - 将 const char[] 初始化为非静态类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65164786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com