2012-08-14 68 views
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. 实现这样一个类的最好方法是什么?
+0

你究竟在做什么? – 2012-08-14 12:58:32

+0

我想要有一个类有时负责数据的重新分配,有些时候它只引用它,并允许更高级别的逻辑访问它并及时释放它。 – Xyand 2012-08-14 13:00:22

+0

理想情况下,一个班级应该做一件“事情”,而不是两件事。您是否考虑过与更高层次的逻辑分开来管理释放?例如,在MyClass中始终有一个引用,并在必要时在构造MyClass之前创建字符串的副本。 – 2012-08-14 13:08:31

回答

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

+0

谢谢。你会认为这是一个很好的设计? – Xyand 2012-08-14 13:02:50

+0

@阿尔伯特:这是无法回答的背景。如果它适合并解决你的问题,那么我不会看到不使用它的直接原因... – 2012-08-14 13:03:42

+0

我认为一个命名构造函数会更合适,因为如果我想要可以拥有(复制)非const字符串。我也认为'dont_touch_me'应该是一个聪明的指针,因为如果'string'被更复杂的类所取代,它可能会占用不必要的空间。 – Xyand 2012-08-14 13:14:34

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

相关问题