我考虑编写一个行为不同的类,具体取决于它的构造方法:
示例:
// #1 - Own an object
class MyClass {
MyClass(std::string const& str) : m_str(str) {}
std::string m_str;
}
// #2 - Share an object (Can be done by pointer as well)
class MyClass {
MyClass(std::string& str) : m_str(str) {}
std::string& m_str;
}
答案 0 :(得分:2)
试试这个:
struct MyClass
{
std::unique_ptr<std::string> dont_touch_me;
std::string & str;
explicit MyClass(std::string const & s)
: dont_touch_me(new std::string(s))
, str(*dont_touch_me)
{ }
explicit MyClass(std::string & r)
: str(r)
{ }
};
现在请确保始终使用MyClass::str
。
答案 1 :(得分:0)
struct ReferenceHolder
{
private:
std::string& m_str;
public:
ReferenceHolder(std::string& str) : m_str(str) {}
// ... all other methods operating on m_str
};
struct ValueHolder : public ReferenceHolder
{
private:
std::string m_str;
public:
ValueHolder(const std::string& str) : ReferenceHolder(m_str), m_str(str) {}
};
将这两种行为组合在一个类中并不是一个好主意,因为使用非const引用构造的对象将不使用内部字符串。如果调用者可以决定是否将const或非const引用传递给构造函数,那么在两个类名之间做出决定一定没有困难。
虽然持有std::string
和引用的开销很小。如果你想用值内部的字符串无缝地传递你的对象,那么你应该像Kerrek SB建议的那样。