Вы можете написать свой конструктор следующим образом:
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) {}
};
Если вы действительно хотите указатель, он было бы намного лучше использовать std::unique_ptr
или 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
, хотя вы можете захотеть для лучшего сообщения об ошибках.