首页 > 解决方案 > 如何将字符串保存到 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*作为其论点,并从那里开始工作。

标签: c++stringpointersconstructor

解决方案


您可以按如下方式编写构造函数:

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_ptror 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,尽管您可能希望获得更好的错误消息。


推荐阅读