同时拥有和共享对象的类

时间:2012-08-14 12:56:11

标签: c++ constructor

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

示例:

// #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. 实施这样一个班级的最佳方法是什么?

2 个答案:

答案 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建议的那样。