c++ - 如何将字符串保存到 C++ 中类的 string* 成员?
问题描述
我有一个 C++ 类,它的成员中包含一个std::string*
. 我想为这个类创建一个构造函数,它将 astd::string
作为参数并使字符串指针指向它:
class foo
{
private:
std::string * bar;
public:
foo(std::string);
}
foo::foo(std::string s)
{
//code
}
如果我这样做this->bar = &s;
显然不起作用(应该保存 s 字符串的地址)。我该怎么做呢?
我尝试创建一个以字符串指针作为参数的构造函数,但它也无法正常工作,我假设出于类似的原因。
编辑:阅读评论后,我决定更改构造函数,因此现在将 astd::string*
作为其论点,并从那里开始工作。
解决方案
您可以按如下方式编写构造函数:
foo::foo(std::string s)
{
bar = new std::string(s); // code
}
但是现在你有内存泄漏,所以你需要一个析构函数:
foo::~foo() { delete bar; }
然后您需要实施或禁用复制/分配。
class foo final
{
...
foo(const foo&) = delete;
foo& operator=(const foo&) = delete;
...
};
std::string
存储指针而不是实例需要付出很多努力:
class foo final
{
std::string bar; // NOT std::string* bar
public:
foo(std::string s) : bar(s) {}
};
如果你真的想要一个指针,最好使用 a std::unique_ptr
or std::shared_ptr
。
class foo final
{
std::unique_ptr<std::string> bar;
public:
foo(std::string s) : bar(std::make_unique<std::string>(s)) {}
};
std::unique_ptr
无法复制/分配,因此您甚至不必禁用复制/分配foo
,尽管您可能希望获得更好的错误消息。
推荐阅读
- vue.js - Heroku 在部署 MEVN 应用程序时出现构建错误,为什么 heroku 显示 babel-loader 和 vue-loader 错误?
- r - 如何在 R 中测试预测变量的所有子集
- r - httr 有时会在 URL 中将“%”替换为“%25”
- python - algorithm - 通过特定顶点的路径查找
- javascript - 如何在 django forms.DateInput 值中获取更新的当前日期
- python - 将 numpy 记录保存和加载为多部分文件
- c# - Unity - 使文本扩展然后收缩,就像向用户弹出一样。我想引起用户注意他们的分数
- c - 为什么char指针在签名后可以增值?
- python - Python youtube搜索如何获取“链接”?
- excel - 电子邮件显示但不发送