0

我考虑编写一个行为不同的类,具体取决于它的构造方法:

例子:

// #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;
}
  1. 将这两种行为放在同一个类中是个好主意吗?
  2. 实现这样一个类的最佳方法是什么?
4

2 回答 2

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一切。

于 2012-08-14T13:00:02.647 回答
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 引用传递给构造函数,那么在两个类名之间做出决定一定没有困难。

不过,同时持有std::string和引用的开销相当小。如果您想通过值无缝传递包含字符串的对象,那么您应该按照 Kerrek SB 的建议进行操作。

于 2012-08-14T13:13:50.063 回答