如何使用typedef完全隐藏特定类型?

时间:2010-03-10 02:17:46

标签: c++ oop encapsulation typedef

我有一个关于使用typedef封装特定类型的快速问题。假设我有一个类Foo,其构造函数具有特定值,但我想使用typedef隐藏特定类型:

class Foo {
public:
  typedef boost::shared_ptr< std::vector<int> > value_type;  
  Foo(value_type val) : val_(val) {}
private:
  value_type val_;
};

但在这种情况下,主要功能仍然必须知道类型(所以它明确使用std::vector<int>):

int main() {
  Foo::value_type val(new std::vector<int>());
  val->push_back(123);
  Foo foo(val);
  return 0;
}

如何在Foo构造函数中避免向量的深层副本的同时解决这个问题?

2 个答案:

答案 0 :(得分:6)

各种解决方案:

Foo::value_type val(new Foo::value_type::element_type());
// least change from your current code, might be too verbose or too
// coupled to boost's smart pointer library, depending on your needs

Foo::value_type val(new Foo::element_type());
// add this typedef to Foo: typedef value_type::element_type element_type;

Foo::value_type val = Foo::new_value_type();
// static method in Foo, allows you to even easily change from new (as you
// encapsulate the whole smart pointer, and can specify another deleter to the
// boost::shared_ptr)

struct Foo {
  static value_type new_value_type() { // function used above
    return value_type(new value_type::element_type());
  }
};

但是,如果您想要的是在Foo中使用向量成员从外部数据初始化而不复制它,而不是通过shared_ptr实际共享,那么我根本不会使用shared_ptr。在Foo的ctor中引用并记录它改变了对象。

struct Foo {
  typedef std::vector<int> value_type;
  explicit Foo(value_type& val) {
    using std::swap;
    swap(val, _val);
  }

private:
  value_type _val;
};

int main() {
  Foo::value_type val;
  val->push_back(123);
  Foo foo(val);
  return 0;
}

答案 1 :(得分:1)

提供的示例中没有深层副本。 shared_ptr被复制,但只创建了一个向量。您可以通过在Foo构造函数之后第二次调用push_back并注意到Foo.val_也发生更改来确认这一点。