说我有一个变量
std::string str; // initialized with some value
结构定义为:
struct test
{
public:
const char* name;
};
我知道可以做到这一点:
test t1;
t1.name = str.c_str();
但是这会将变量str的地址存储在t1.name
中相反,我希望 str 的值放入结构的char数组成员中,该成员应该与变量str的完全相同的大小。
有没有办法可以实现或更好的设计
提前致谢!
答案 0 :(得分:0)
但是这会将变量str的地址存储在t1.name
中
不完全是。 DATEDIFF()
不会返回变量str.c_str()
的地址。它返回str
所拥有的字符数组的地址。
相反,我希望str的值放入结构的
数组成员
为此,结构必须具有str
数组成员。你的结构没有;它有一个指针成员。
结构的char数组成员,其大小应与变量str完全相同。
这是不可能的。字符串的大小是动态的,即它可能在运行时改变。必须在编译时知道成员数组的大小。
您可以改为动态分配数组。顾名思义,动态分配的大小可以在运行时确定。但是,必须手动取消分配动态分配,否则程序将泄漏内存。
或更好的设计
动态分配的流行设计模式是RAII。标准库已经有一个用于字符串的RAII容器:char
。因此,要将字符串复制到结构的成员中,一个好的设计是将字符串作为成员:
std::string
答案 1 :(得分:0)
没有理由使用const char *
,因为它更容易出错且更难实现,您应该使用std::string
。
std::string
还允许您使用const char *
方法将c_str()
变为字符串。
但是如果你必须将名称实现为C风格的字符串,那么你需要做的就是:
new
在堆上分配足够的空间。strcpy
构造
test(const std::string& str) : name(new char[str.length() + 1])
{
strcpy((char*)name, str.c_str()); }
};
<强> [Live demo] 强>
同样注意到@Pixelchemist ,还有重要的rules of zero/three/five。如果你的类包含没有正确复制/破坏的资源,那么就像纯指针不是一样(如果你使用智能指针,那将是不同的故事),你必须实现这些:
对于扩展信息,请阅读this excellent answer about rule of three。